Packages moving and test of security layer.
This commit is contained in:
@@ -11,9 +11,11 @@ import javax.servlet.ServletException;
|
|||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
import javax.servlet.ServletResponse;
|
import javax.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.codiki.security.Route;
|
import org.codiki.core.security.Route;
|
||||||
import org.codiki.utils.StringUtils;
|
import org.codiki.core.utils.StringUtils;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for all filters of the application.<br/>
|
* Base class for all filters of the application.<br/>
|
||||||
@@ -54,7 +56,7 @@ public abstract class AbstractFilter implements Filter {
|
|||||||
* @param chain
|
* @param chain
|
||||||
* The chain.
|
* The chain.
|
||||||
*/
|
*/
|
||||||
protected abstract void filter(HttpServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
|
protected abstract void filter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||||
@@ -62,7 +64,7 @@ public abstract class AbstractFilter implements Filter {
|
|||||||
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
||||||
|
|
||||||
if(isRequestFiltered(httpRequest.getRequestURL().toString(), httpRequest.getMethod())) {
|
if(isRequestFiltered(httpRequest.getRequestURL().toString(), httpRequest.getMethod())) {
|
||||||
filter(httpRequest, response, chain);
|
filter(httpRequest, (HttpServletResponse) response, chain);
|
||||||
} else {
|
} else {
|
||||||
chain.doFilter(request, response);
|
chain.doFilter(request, response);
|
||||||
}
|
}
|
||||||
@@ -71,14 +73,14 @@ public abstract class AbstractFilter implements Filter {
|
|||||||
/**
|
/**
|
||||||
* Check if the url is allowed with the given method in parameters.
|
* Check if the url is allowed with the given method in parameters.
|
||||||
*
|
*
|
||||||
* @param pUrlRequest
|
* @param pRequestUrl
|
||||||
* The url request.
|
* The url request.
|
||||||
* @param pMethodRequest
|
* @param pRequestMethod
|
||||||
* The http method of the request.
|
* The http method of the request.
|
||||||
* @return {@code true} if the url is allowed with the method, {@code false}
|
* @return {@code true} if the url is allowed with the method, {@code false}
|
||||||
* otherwise.
|
* otherwise.
|
||||||
*/
|
*/
|
||||||
boolean isRequestFiltered(final String pUrlRequest, final String pMethodRequest) {
|
boolean isRequestFiltered(final String pRequestUrl, final String pRequestMethod) {
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
|
||||||
for(final Route route : getRoutes()) {
|
for(final Route route : getRoutes()) {
|
||||||
@@ -86,9 +88,31 @@ public abstract class AbstractFilter implements Filter {
|
|||||||
* Check urls matching, and if the method of the route isn't set, all methods
|
* Check urls matching, and if the method of the route isn't set, all methods
|
||||||
* are allowed. Otherwise, we check the methods too.
|
* are allowed. Otherwise, we check the methods too.
|
||||||
*/
|
*/
|
||||||
result = Pattern.matches(StringUtils.concat(PREFIX_URL_PATH, route.getUrl()), pUrlRequest)
|
if(Pattern.matches(StringUtils.concat(PREFIX_URL_PATH, route.getUrl()), pRequestUrl)) {
|
||||||
&& (!route.getMethod().isPresent() || pMethodRequest.equals(route.getMethod().get().toString()));
|
if(!route.getMethod().isPresent() || isMethodFiltered(route, pRequestMethod)) {
|
||||||
if(result) {
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the route do filter the method in parameters.
|
||||||
|
*
|
||||||
|
* @param pRoute
|
||||||
|
* The registered route.
|
||||||
|
* @param pRequestMethod
|
||||||
|
* The http method to check with the registered route.
|
||||||
|
*/
|
||||||
|
boolean isMethodFiltered(final Route pRoute, final String pRequestMethod) {
|
||||||
|
boolean result = false;
|
||||||
|
|
||||||
|
for(final HttpMethod routeMethod : pRoute.getMethod().get()) {
|
||||||
|
if(routeMethod.name().equals(pRequestMethod)) {
|
||||||
|
result = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.config;
|
package org.codiki.core.config;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.codiki.entities.dto;
|
package org.codiki.core.entities.dto;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import org.codiki.entities.persistence.Role;
|
import org.codiki.core.entities.persistence.Role;
|
||||||
import org.codiki.entities.persistence.User;
|
import org.codiki.core.entities.persistence.User;
|
||||||
|
|
||||||
public class UserDAO {
|
public class UserDAO {
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -18,7 +18,7 @@ import javax.persistence.Table;
|
|||||||
import javax.persistence.Temporal;
|
import javax.persistence.Temporal;
|
||||||
import javax.persistence.TemporalType;
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
import org.codiki.utils.DateUtils;
|
import org.codiki.core.utils.DateUtils;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name="post")
|
@Table(name="post")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.persistence;
|
package org.codiki.core.entities.persistence;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -20,7 +20,7 @@ import javax.persistence.Table;
|
|||||||
import javax.persistence.Temporal;
|
import javax.persistence.Temporal;
|
||||||
import javax.persistence.TemporalType;
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
import org.codiki.entities.security.Token;
|
import org.codiki.core.entities.security.Token;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name="`user`")
|
@Table(name="`user`")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.entities.security;
|
package org.codiki.core.entities.security;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.codiki.core.repositories;
|
||||||
|
|
||||||
|
import org.codiki.core.entities.persistence.Post;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface PostRepository extends CrudRepository<Post, Long> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.codiki.repositories;
|
package org.codiki.core.repositories;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.codiki.entities.persistence.User;
|
import org.codiki.core.entities.persistence.User;
|
||||||
import org.springframework.data.repository.CrudRepository;
|
import org.springframework.data.repository.CrudRepository;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.security;
|
package org.codiki.core.security;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -8,8 +8,10 @@ import javax.servlet.FilterChain;
|
|||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.ServletResponse;
|
import javax.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.codiki.core.AbstractFilter;
|
import org.codiki.core.AbstractFilter;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -18,18 +20,25 @@ import org.springframework.stereotype.Component;
|
|||||||
@Order(Ordered.HIGHEST_PRECEDENCE)
|
@Order(Ordered.HIGHEST_PRECEDENCE)
|
||||||
public class AuthenticationFilter extends AbstractFilter {
|
public class AuthenticationFilter extends AbstractFilter {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TokenService tokenService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<Route> getRoutes() {
|
protected List<Route> getRoutes() {
|
||||||
return Arrays.asList(
|
return Arrays.asList(
|
||||||
new Route("\\/api\\/account\\/.*")
|
new Route("\\/api\\/posts.*")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void filter(HttpServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
protected void filter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
|
||||||
System.out.println("Token : " + request.getHeader("token"));
|
System.out.println("Token : " + request.getHeader("token"));
|
||||||
|
|
||||||
chain.doFilter(request, response);
|
if(tokenService.isUserConnected(request.getHeader("token"))) {
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
} else {
|
||||||
|
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.codiki.security;
|
package org.codiki.core.security;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
@@ -14,7 +16,7 @@ public class Route {
|
|||||||
/** The regex to match urls. */
|
/** The regex to match urls. */
|
||||||
private String url;
|
private String url;
|
||||||
/** The http method to match. Use a {@link Optional#empty()} to match all methods. */
|
/** The http method to match. Use a {@link Optional#empty()} to match all methods. */
|
||||||
private Optional<HttpMethod> method;
|
private Optional<List<HttpMethod>> method;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instanciate a vierge route.
|
* Instanciate a vierge route.
|
||||||
@@ -45,9 +47,9 @@ public class Route {
|
|||||||
* The http method to match. Use a {@link Optional#empty()} to match
|
* The http method to match. Use a {@link Optional#empty()} to match
|
||||||
* all methods.
|
* all methods.
|
||||||
*/
|
*/
|
||||||
public Route(final String pUrl, final HttpMethod pMethod) {
|
public Route(final String pUrl, final HttpMethod... pMethods) {
|
||||||
this(pUrl);
|
this(pUrl);
|
||||||
this.method = Optional.of(pMethod);
|
this.method = Optional.of(Arrays.asList(pMethods));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUrl() {
|
public String getUrl() {
|
||||||
@@ -58,12 +60,12 @@ public class Route {
|
|||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<HttpMethod> getMethod() {
|
public Optional<List<HttpMethod>> getMethod() {
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMethod(HttpMethod method) {
|
public void setMethod(HttpMethod pMethods) {
|
||||||
this.method = Optional.of(method);
|
this.method = Optional.of(Arrays.asList(pMethods));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.codiki.security;
|
package org.codiki.core.security;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import org.codiki.entities.persistence.User;
|
import org.codiki.core.entities.persistence.User;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.utils;
|
package org.codiki.core.utils;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.utils;
|
package org.codiki.core.utils;
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.codiki.utils;
|
package org.codiki.core.utils;
|
||||||
|
|
||||||
import org.mindrot.jbcrypt.BCrypt;
|
import org.mindrot.jbcrypt.BCrypt;
|
||||||
|
|
||||||
@@ -3,8 +3,8 @@ package org.codiki.login;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.codiki.entities.dto.UserDAO;
|
import org.codiki.core.entities.dto.UserDAO;
|
||||||
import org.codiki.security.TokenService;
|
import org.codiki.core.security.TokenService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import java.util.Optional;
|
|||||||
import javax.naming.AuthenticationException;
|
import javax.naming.AuthenticationException;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.codiki.entities.dto.UserDAO;
|
import org.codiki.core.entities.dto.UserDAO;
|
||||||
import org.codiki.entities.persistence.User;
|
import org.codiki.core.entities.persistence.User;
|
||||||
import org.codiki.repositories.UserRepository;
|
import org.codiki.core.repositories.UserRepository;
|
||||||
import org.codiki.security.TokenService;
|
import org.codiki.core.security.TokenService;
|
||||||
import org.codiki.utils.StringUtils;
|
import org.codiki.core.utils.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
|||||||
21
src/main/java/org/codiki/posts/PostController.java
Normal file
21
src/main/java/org/codiki/posts/PostController.java
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package org.codiki.posts;
|
||||||
|
|
||||||
|
import org.codiki.core.entities.persistence.Post;
|
||||||
|
import org.codiki.core.repositories.PostRepository;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/posts")
|
||||||
|
public class PostController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PostRepository postRepository;
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public Iterable<Post> getAll() {
|
||||||
|
return postRepository.findAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,15 +6,13 @@ import java.util.List;
|
|||||||
|
|
||||||
import javax.servlet.FilterChain;
|
import javax.servlet.FilterChain;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.ServletResponse;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.codiki.security.Route;
|
import org.codiki.core.security.Route;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
@@ -36,7 +34,7 @@ public class AbstractFilterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void filter(HttpServletRequest request, ServletResponse response, FilterChain chain)
|
protected void filter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
||||||
throws IOException, ServletException {
|
throws IOException, ServletException {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
@@ -69,4 +67,16 @@ public class AbstractFilterTest {
|
|||||||
|
|
||||||
Assert.assertFalse(filter.isRequestFiltered("http://localhost/toto", "GET"));
|
Assert.assertFalse(filter.isRequestFiltered("http://localhost/toto", "GET"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_isRequestFiltered_severalHttpMethods() {
|
||||||
|
((TestFilter) filter).routes = Arrays.asList(new Route("toto", HttpMethod.GET, HttpMethod.POST));
|
||||||
|
|
||||||
|
Assert.assertTrue(filter.isRequestFiltered("http://localhost/toto", "GET"));
|
||||||
|
Assert.assertTrue(filter.isRequestFiltered("http://localhost/toto", "POST"));
|
||||||
|
Assert.assertFalse(filter.isRequestFiltered("http://localhost/toto", "PUT"));
|
||||||
|
Assert.assertFalse(filter.isRequestFiltered("http://localhost/toto", "DELETE"));
|
||||||
|
Assert.assertFalse(filter.isRequestFiltered("http://localhost/toto", "DumbThing"));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user