11package org .nkcoder .security ;
22
33import io .jsonwebtoken .Claims ;
4- import io .jsonwebtoken .JwtException ;
4+ import io .jsonwebtoken .ExpiredJwtException ;
5+ import io .jsonwebtoken .MalformedJwtException ;
6+ import io .jsonwebtoken .UnsupportedJwtException ;
57import jakarta .servlet .FilterChain ;
68import jakarta .servlet .ServletException ;
79import jakarta .servlet .http .HttpServletRequest ;
810import jakarta .servlet .http .HttpServletResponse ;
911import java .io .IOException ;
1012import java .util .List ;
13+ import java .util .Optional ;
1114import java .util .UUID ;
1215import org .jetbrains .annotations .NotNull ;
1316import org .nkcoder .enums .Role ;
2932@ Component
3033public class JwtAuthenticationFilter extends OncePerRequestFilter {
3134
35+ private static final String AUTHORIZATION_HEADER = "Authorization" ;
36+ private static final String BEARER_PREFIX = "Bearer " ;
37+ private static final String ATTRIBUTE_USER_ID = "userId" ;
38+ private static final String ATTRIBUTE_ROLE = "role" ;
39+ private static final String ATTRIBUTE_EMAIL = "email" ;
40+
3241 private static final Logger logger = LoggerFactory .getLogger (JwtAuthenticationFilter .class );
3342
3443 private final JwtUtil jwtUtil ;
@@ -46,48 +55,56 @@ protected void doFilterInternal(
4655 throws ServletException , IOException {
4756 logger .debug ("Processing authentication for request: {}" , request .getRequestURI ());
4857
49- try {
50- String jwt = getJwtFromRequest (request );
51-
52- if (StringUtils .hasText (jwt ) && !jwtUtil .isTokenExpired (jwt )) {
53- Claims claims = jwtUtil .validateAccessToken (jwt );
54-
55- UUID userId = UUID .fromString (claims .getSubject ());
56- String email = claims .get ("email" , String .class );
57- String roleString = claims .get ("role" , String .class );
58- Role role = Role .valueOf (roleString );
59-
60- // Create authorities
61- List <GrantedAuthority > authorities =
62- List .of (new SimpleGrantedAuthority ("ROLE_" + role .name ()));
63-
64- UserDetails userDetails = new User (email , "" , authorities );
65- UsernamePasswordAuthenticationToken authentication =
66- new UsernamePasswordAuthenticationToken (userDetails , null , authorities );
67-
68- authentication .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
69-
70- // Set custom attributes
71- request .setAttribute ("userId" , userId );
72- request .setAttribute ("email" , email );
73- request .setAttribute ("role" , role );
74-
75- SecurityContextHolder .getContext ().setAuthentication (authentication );
76-
77- logger .debug ("Set authentication for user: {}" , email );
78- }
79- } catch (JwtException e ) {
80- logger .error ("Cannot set user authentication: {}" , e .getMessage ());
81- }
58+ extractTokenFromRequest (request )
59+ .ifPresent (
60+ token -> {
61+ try {
62+ Claims claims = jwtUtil .validateAccessToken (token );
63+
64+ UUID userId = UUID .fromString (claims .getSubject ());
65+ String email = claims .get ("email" , String .class );
66+ String roleString = claims .get ("role" , String .class );
67+ Role role = Role .valueOf (roleString );
68+
69+ // Create authorities
70+ List <GrantedAuthority > authorities =
71+ List .of (new SimpleGrantedAuthority ("ROLE_" + role .name ()));
72+
73+ UserDetails userDetails = new User (email , "" , authorities );
74+ UsernamePasswordAuthenticationToken authentication =
75+ new UsernamePasswordAuthenticationToken (userDetails , null , authorities );
76+
77+ authentication .setDetails (
78+ new WebAuthenticationDetailsSource ().buildDetails (request ));
79+
80+ // Set custom attributes
81+ request .setAttribute (ATTRIBUTE_USER_ID , userId );
82+ request .setAttribute (ATTRIBUTE_EMAIL , email );
83+ request .setAttribute (ATTRIBUTE_ROLE , role );
84+
85+ SecurityContextHolder .getContext ().setAuthentication (authentication );
86+
87+ logger .debug ("Set authentication for userId: {}" , userId );
88+ } catch (ExpiredJwtException e ) {
89+ logger .error ("JWT token expired: {}" , e .getMessage ());
90+ } catch (MalformedJwtException e ) {
91+ logger .error ("Malformed JWT token: {}" , e .getMessage ());
92+ } catch (UnsupportedJwtException e ) {
93+ logger .error ("Unsupported JWT token: {}" , e .getMessage ());
94+ } catch (SecurityException e ) {
95+ logger .error ("JWT signature validation failed: {}" , e .getMessage ());
96+ } catch (IllegalArgumentException e ) {
97+ logger .error ("JWT token compact of handler are invalid: {}" , e .getMessage ());
98+ }
99+ });
82100
83101 filterChain .doFilter (request , response );
84102 }
85103
86- private String getJwtFromRequest (HttpServletRequest request ) {
87- String bearerToken = request .getHeader ("Authorization" );
88- if (StringUtils .hasText (bearerToken ) && bearerToken .startsWith ("Bearer " )) {
89- return bearerToken .substring (7 );
90- }
91- return null ;
104+ private Optional <String > extractTokenFromRequest (HttpServletRequest request ) {
105+ return Optional .ofNullable (request .getHeader (AUTHORIZATION_HEADER ))
106+ .filter (StringUtils ::hasText )
107+ .filter (token -> token .startsWith (BEARER_PREFIX ))
108+ .map (token -> token .substring (BEARER_PREFIX .length ()));
92109 }
93110}
0 commit comments