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
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 }