|
|
@@ -0,0 +1,157 @@
|
|
|
+package pl.dmcs.jwoszczyk.security;
|
|
|
+
|
|
|
+import jakarta.servlet.http.HttpServletRequest;
|
|
|
+import jakarta.servlet.http.HttpServletResponse;
|
|
|
+import org.springframework.http.HttpStatus;
|
|
|
+import org.springframework.web.servlet.HandlerInterceptor;
|
|
|
+import org.springframework.web.servlet.ModelAndView;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
+
|
|
|
+public class CustomInterceptor implements HandlerInterceptor {
|
|
|
+ // endpoints
|
|
|
+ private Map<String, Map<String, Set<String>>> endpointRoles = new HashMap<>();
|
|
|
+
|
|
|
+ public CustomInterceptor() {
|
|
|
+ Map<String, Set<String>> songRoles = new HashMap<>();
|
|
|
+ songRoles.put("GET", Set.of("ROLE_USER", "ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ songRoles.put("POST", Set.of("ROLE_USER", "ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ songRoles.put("PUT", Set.of("ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ songRoles.put("DELETE", Set.of("ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ endpointRoles.put("/song", songRoles);
|
|
|
+
|
|
|
+ Map<String, Set<String>> riffRoles = new HashMap<>();
|
|
|
+ riffRoles.put("GET", Set.of("ROLE_USER", "ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ riffRoles.put("POST", Set.of("ROLE_USER", "ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ riffRoles.put("PUT", Set.of("ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ riffRoles.put("DELETE", Set.of("ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ endpointRoles.put("/riffs", riffRoles);
|
|
|
+
|
|
|
+ Map<String, Set<String>> userRoles = new HashMap<>();
|
|
|
+ userRoles.put("GET", Set.of("ROLE_USER", "ROLE_MODERATOR", "ROLE_ADMIN"));
|
|
|
+ userRoles.put("POST", Set.of("ROLE_ADMIN"));
|
|
|
+ userRoles.put("PUT", Set.of("ROLE_ADMIN"));
|
|
|
+ userRoles.put("DELETE", Set.of("ROLE_ADMIN"));
|
|
|
+ endpointRoles.put("/users", userRoles);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private final List<String> noAuth = List.of( "/riffmaster/login",
|
|
|
+ "/register");// Endpoints that require no authorization
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
|
|
+
|
|
|
+ System.out.println("\n#######################################################################START PRE HANDLING A REQUEST");
|
|
|
+ if (Objects.equals(request.getMethod(), "OPTIONS")) {
|
|
|
+ response.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
|
|
+ response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
|
|
|
+ response.setHeader("Access-Control-Max-Age", "3600");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ System.out.println("test: " + request.getHeader("access-control-request-headers"));
|
|
|
+ System.out.println("test here: " + request.getHeader("access-control-request-headers.authorization"));
|
|
|
+
|
|
|
+ String endpoint = request.getRequestURI();
|
|
|
+// System.out.println(request.getHeaderNames().toString());
|
|
|
+ Enumeration<String> headerNames = request.getHeaderNames();
|
|
|
+ while (headerNames.hasMoreElements()) {
|
|
|
+ String headerName = headerNames.nextElement();
|
|
|
+ String headerValue = request.getHeader(headerName);
|
|
|
+ System.out.println(headerName + ": " + headerValue);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (noAuth.contains(endpoint)) {
|
|
|
+ System.out.println("no auth required for this request\n");
|
|
|
+ return HandlerInterceptor.super.preHandle(request, response, handler);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ try{
|
|
|
+ System.out.println("authorization needed");
|
|
|
+
|
|
|
+
|
|
|
+ String token = request.getHeader("Authorization").split(" ")[1];
|
|
|
+
|
|
|
+
|
|
|
+ if (JwtTokenUtil.validateToken(token))
|
|
|
+ {
|
|
|
+ System.out.println(" token is valid\n");
|
|
|
+
|
|
|
+ //-------------------------------------------------------get roles
|
|
|
+ String method = request.getMethod();
|
|
|
+ Set<String> userRoles = JwtTokenUtil.getRolesFromToken(token);
|
|
|
+ System.out.println("reHandle mehod");
|
|
|
+ //-------------------------------------------------------check user authority
|
|
|
+
|
|
|
+ if (isAuthorized(endpoint, method, userRoles)) {
|
|
|
+ System.out.println("preauthorizing reuqst");
|
|
|
+ return HandlerInterceptor.super.preHandle(request, response, handler);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ response.setStatus(HttpStatus.FORBIDDEN.value());
|
|
|
+ response.getWriter().write("Unauthorized access");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else // token not valid
|
|
|
+ {
|
|
|
+ response.setStatus(HttpStatus.UNAUTHORIZED.value());
|
|
|
+ response.getWriter().write("Invalid token");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ catch (NullPointerException e) {
|
|
|
+ System.out.println(e);
|
|
|
+ response.setStatus(HttpStatus.UNAUTHORIZED.value());
|
|
|
+ response.getWriter().write("Empty header");
|
|
|
+ }
|
|
|
+ catch (Exception e) {
|
|
|
+ System.out.println(e);
|
|
|
+ response.setStatus(HttpStatus.UNAUTHORIZED.value());
|
|
|
+ response.getWriter().write("Missing authorization header");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isAuthorized(String endpoint, String method, Set<String> roles) {
|
|
|
+ System.out.println("Authorization in isAuthorized() method");
|
|
|
+ System.out.println(" endpoint: " + endpoint);
|
|
|
+ System.out.println(" method: " + method);
|
|
|
+ System.out.println(" roles: " + roles);
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, Set<String>> methodRoles = endpointRoles.get(endpoint);
|
|
|
+ if (methodRoles != null) {
|
|
|
+ Set<String> requiredRoles = methodRoles.get(method);
|
|
|
+ if (requiredRoles != null) {
|
|
|
+ return !Collections.disjoint(roles, requiredRoles);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
|
|
|
+ HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
|
|
+ HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
|
|
|
+ }
|
|
|
+}
|