source: sources/app/src/main/java/parkup/configs/CustomAuthorizationFilter.java@ e8b1076

Last change on this file since e8b1076 was 9dd526f, checked in by andrejTavchioski <andrej.tavchioski@…>, 2 years ago

backend refactoring

  • Property mode set to 100644
File size: 3.4 KB
Line 
1package parkup.configs;
2
3import com.auth0.jwt.JWT;
4import com.auth0.jwt.JWTVerifier;
5import com.auth0.jwt.algorithms.Algorithm;
6import com.auth0.jwt.interfaces.DecodedJWT;
7import com.fasterxml.jackson.databind.ObjectMapper;
8import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
9import org.springframework.security.core.authority.SimpleGrantedAuthority;
10import org.springframework.security.core.context.SecurityContextHolder;
11import org.springframework.util.MimeTypeUtils;
12import org.springframework.web.bind.annotation.CrossOrigin;
13import org.springframework.web.filter.OncePerRequestFilter;
14
15import javax.servlet.FilterChain;
16import javax.servlet.ServletException;
17import javax.servlet.http.HttpServletRequest;
18import javax.servlet.http.HttpServletResponse;
19import java.io.IOException;
20import java.util.ArrayList;
21import java.util.Collection;
22import java.util.HashMap;
23import java.util.Map;
24
25import static java.util.Arrays.stream;
26import static org.springframework.http.HttpHeaders.AUTHORIZATION;
27import static org.springframework.http.HttpStatus.FORBIDDEN;
28
29
30@CrossOrigin
31public class CustomAuthorizationFilter extends OncePerRequestFilter {
32 @Override
33 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
34 if(request.getServletPath().equals("/api/login") || request.getServletPath().equals("/api/token/refresh")) {
35 filterChain.doFilter(request, response);
36 } else {
37 String authorizationHeader = request.getHeader(AUTHORIZATION);
38 if(authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
39 try {
40 String token = authorizationHeader.substring("Bearer ".length());
41 Algorithm algorithm = Algorithm.HMAC256("secret".getBytes());
42 JWTVerifier verifier = JWT.require(algorithm).build();
43 DecodedJWT decodedJWT = verifier.verify(token);
44 String username = decodedJWT.getSubject();
45 String[] roles = decodedJWT.getClaim("roles").asArray(String.class);
46 Collection<SimpleGrantedAuthority> authorities = new ArrayList<>();
47 stream(roles).forEach(role -> {
48 authorities.add(new SimpleGrantedAuthority(role));
49 });
50 UsernamePasswordAuthenticationToken authenticationToken =
51 new UsernamePasswordAuthenticationToken(username, null, authorities);
52 SecurityContextHolder.getContext().setAuthentication(authenticationToken);
53 filterChain.doFilter(request, response);
54 }catch (Exception exception) {
55 response.setHeader("error", exception.getMessage());
56 response.setStatus(FORBIDDEN.value());
57 //response.sendError(FORBIDDEN.value());
58 Map<String, String> error = new HashMap<>();
59 error.put("error_message", exception.getMessage());
60 response.setContentType(MimeTypeUtils.APPLICATION_JSON_VALUE);
61 new ObjectMapper().writeValue(response.getOutputStream(), error);
62 }
63 } else {
64 filterChain.doFilter(request, response);
65 }
66 }
67 }
68}
Note: See TracBrowser for help on using the repository browser.