1+ package com .kvark900 .api .configuration .security ;
2+
3+ import io .jsonwebtoken .ExpiredJwtException ;
4+ import org .slf4j .Logger ;
5+ import org .slf4j .LoggerFactory ;
6+ import org .springframework .security .authentication .UsernamePasswordAuthenticationToken ;
7+ import org .springframework .security .core .context .SecurityContextHolder ;
8+ import org .springframework .security .core .userdetails .UserDetails ;
9+ import org .springframework .security .core .userdetails .UserDetailsService ;
10+ import org .springframework .security .web .authentication .WebAuthenticationDetailsSource ;
11+ import org .springframework .web .filter .OncePerRequestFilter ;
12+
13+ import javax .servlet .FilterChain ;
14+ import javax .servlet .ServletException ;
15+ import javax .servlet .http .HttpServletRequest ;
16+ import javax .servlet .http .HttpServletResponse ;
17+ import java .io .IOException ;
18+
19+ public class JWTTokenFilter extends OncePerRequestFilter {
20+
21+ private final Logger logger = LoggerFactory .getLogger (this .getClass ());
22+
23+ private UserDetailsService userDetailsService ;
24+ private JWTUtil jwtUtil ;
25+ private String tokenHeader ;
26+
27+ public JWTTokenFilter (UserDetailsService userDetailsService , JWTUtil jwtUtil , String tokenHeader ) {
28+ this .userDetailsService = userDetailsService ;
29+ this .jwtUtil = jwtUtil ;
30+ this .tokenHeader = tokenHeader ;
31+ }
32+
33+ @ Override
34+ protected void doFilterInternal (HttpServletRequest request , HttpServletResponse response , FilterChain chain ) throws ServletException , IOException {
35+ authorizeRequest (request );
36+ chain .doFilter (request , response );
37+ }
38+
39+ private void authorizeRequest (HttpServletRequest request ) {
40+ logger .debug ("Processing authentication for '{}'" , request .getRequestURL ());
41+
42+ final String requestHeader = request .getHeader (this .tokenHeader );
43+
44+ if (requestHeader == null || !requestHeader .startsWith ("Bearer " )) {
45+ logger .warn ("Authorization failed. No JWT token found" );
46+ return ;
47+ }
48+
49+ String username ;
50+ String authToken = requestHeader .substring (7 );
51+
52+ try {
53+ username = jwtUtil .getUsernameFromToken (authToken );
54+ } catch (IllegalArgumentException e ) {
55+ logger .error ("Error during getting username from token" , e );
56+ return ;
57+ } catch (ExpiredJwtException e ) {
58+ logger .warn ("The token has expired" , e );
59+ return ;
60+ }
61+
62+ if (username == null || SecurityContextHolder .getContext ().getAuthentication () != null ) return ;
63+
64+ logger .debug ("Security context was null, so authorizing user '{}'..." , username );
65+
66+ UserDetails userDetails = this .userDetailsService .loadUserByUsername (username );
67+
68+ if (!jwtUtil .validateToken (authToken , userDetails )) {
69+ logger .error ("Not a valid token!!!" );
70+ return ;
71+ }
72+
73+ UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken (userDetails , null , userDetails .getAuthorities ());
74+ authentication .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
75+ logger .info ("Authorized user '{}', setting security context..." , username );
76+ SecurityContextHolder .getContext ().setAuthentication (authentication );
77+ }
78+ }
0 commit comments