View Javadoc
1   package fr.tiogars.domaintemplate.domains.auth.services;
2   
3   import java.io.IOException;
4   
5   import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
6   import org.springframework.security.core.context.SecurityContextHolder;
7   import org.springframework.security.core.userdetails.UserDetails;
8   import org.springframework.security.core.userdetails.UserDetailsService;
9   import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
10  import org.springframework.stereotype.Component;
11  import org.springframework.web.filter.OncePerRequestFilter;
12  
13  import jakarta.servlet.FilterChain;
14  import jakarta.servlet.ServletException;
15  import jakarta.servlet.http.HttpServletRequest;
16  import jakarta.servlet.http.HttpServletResponse;
17  
18  /** Reads Bearer tokens and populates the Spring Security context. */
19  @Component
20  public class JwtAuthenticationFilter extends OncePerRequestFilter {
21  
22      private final JwtTokenService jwtTokenService;
23      private final UserDetailsService userDetailsService;
24  
25      JwtAuthenticationFilter(JwtTokenService jwtTokenService, UserDetailsService userDetailsService) {
26          this.jwtTokenService = jwtTokenService;
27          this.userDetailsService = userDetailsService;
28      }
29  
30      @Override
31      protected void doFilterInternal(
32              HttpServletRequest request,
33              HttpServletResponse response,
34              FilterChain filterChain)
35              throws ServletException, IOException {
36          String authorization = request.getHeader("Authorization");
37          if (authorization != null
38                  && authorization.startsWith("Bearer ")
39                  && SecurityContextHolder.getContext().getAuthentication() == null) {
40              String token = authorization.substring(7);
41              String username = jwtTokenService.extractUsername(token).orElse(null);
42              if (username != null) {
43                  UserDetails userDetails = userDetailsService.loadUserByUsername(username);
44                  if (jwtTokenService.isValid(token, userDetails)) {
45                      UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
46                              userDetails,
47                              null,
48                              userDetails.getAuthorities());
49                      authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
50                      SecurityContextHolder.getContext().setAuthentication(authentication);
51                  }
52              }
53          }
54          filterChain.doFilter(request, response);
55      }
56  }