diff --git a/src/main/java/de/rtuni/ms/apig/JwtTokenAuthenticationFilter.java b/src/main/java/de/rtuni/ms/apig/JwtTokenAuthenticationFilter.java index e561fad14fb895081ec06724747923c4e733c5a8..902c4b64ba9fa18e1eb08abbb5754df9b52e4090 100644 --- a/src/main/java/de/rtuni/ms/apig/JwtTokenAuthenticationFilter.java +++ b/src/main/java/de/rtuni/ms/apig/JwtTokenAuthenticationFilter.java @@ -30,13 +30,13 @@ import io.jsonwebtoken.Jwts; public class JwtTokenAuthenticationFilter extends OncePerRequestFilter { //---------------------------------------------------------------------------------------------- - /** The configuration for the json web token. */ + /** The <code>JwtConfig</code> for the json web token. */ private final JwtConfig jwtConfig; //---------------------------------------------------------------------------------------------- /** - * Set the given configuration for the token. + * Set the given <code>JwtConfig</code> for the token. * * @param config The stated configuration */ @@ -45,61 +45,62 @@ public class JwtTokenAuthenticationFilter extends OncePerRequestFilter { //---------------------------------------------------------------------------------------------- /** + * If a token is supplied by the user the token will be decrypt and the user will be set as + * currently authenticated user. That includes the authorities which were granted to the + * user by the authentication service. If there is no supplied token the next filter will be + * executed. + * <p> * {@inheritDoc} */ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - // 1. get the authentication header. - // Tokens are supposed to be passed in the authentication header. - String header = request.getHeader(jwtConfig.getHeader()); - // 2. validate the header and check the prefix - if (header == null || !header.startsWith(jwtConfig.getPrefix())) { + // Gets the authentication header. + String bearerToken = request.getParameter("access_token"); + // Validate the header and check the prefix. + if (bearerToken == null || !bearerToken.startsWith(jwtConfig.getPrefix())) { + // If no token is provided the user is not authenticated + // and we continue with the next filter. + // Thats okay because maybe the user is accessing a public path. chain.doFilter(request, response); // If not valid, go to the next filter. return; } - /* - * If no token is provided, the user is not authenticated. That is okay. Maybe the user - * accessing a public path or asking for a token. All secured paths that needs a token are - * already defined and secured in SecurityConfiguration class. If the user tried to access - * without access token, then he won't be authenticated and an exception will be thrown. - */ - - // 3. Get the token - String token = header.replace(jwtConfig.getPrefix(), ""); - try { // Exceptions can be triggered when creating claims, e.g if the token has expired - // 4. Validate the token + // Removes the bearer substring from the authentication header. + String token = bearerToken.replace(jwtConfig.getPrefix(), ""); + + // Note that exceptions can be triggered when creating claims, e.g if the token has expired. + try { + // Sets secret and decrypt the token. Claims claims = Jwts.parser().setSigningKey(jwtConfig.getSecret().getBytes()) .parseClaimsJws(token).getBody(); + String username = claims.getSubject(); if (username != null) { + // Gets the authorities which were added to the token by the auth-service. @SuppressWarnings("unchecked") List<String> authorities = (List<String>) claims.get("authorities"); + + // Create an UsernamePasswordAuthenticationToken which represents the + // authenticated user or the user who is being authenticated currently. + // + // Because we need a list of authorities, which are from the type GrantedAuthority + // we have to convert the Strings to SimpleGrantedAuthority which is an + // implementation. + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken( + username, null, authorities.stream() + .map(SimpleGrantedAuthority::new).collect(Collectors.toList())); - // 5. Create auth object - - /* - * UsernamePasswordAuthenticationToken: A built-in object, used by spring to - * represent the current authenticated / being authenticated user. - * It needs a list of authorities, which has type of GrantedAuthority interface, - * where SimpleGrantedAuthority is an implementation of that interface - */ - UsernamePasswordAuthenticationToken auth = - new UsernamePasswordAuthenticationToken( - username, null, authorities.stream(). - map(SimpleGrantedAuthority::new).collect(Collectors.toList())); - - // 6. Authenticate the user + // Set the user as new authenticated user. SecurityContextHolder.getContext().setAuthentication(auth); } } catch (Exception e) { - // In case of failure. Make sure it's clear; so guarantee user won't be authenticated + // In case of failure. Make sure user won't be authenticated. SecurityContextHolder.clearContext(); } - // go to the next filter in the filter chain + chain.doFilter(request, response); }