1
+ package com .javachinna .config ;
2
+
3
+ import java .io .IOException ;
4
+
5
+ import javax .servlet .FilterChain ;
6
+ import javax .servlet .ServletException ;
7
+ import javax .servlet .http .HttpServletRequest ;
8
+ import javax .servlet .http .HttpServletResponse ;
9
+
10
+ import org .springframework .security .authentication .UsernamePasswordAuthenticationToken ;
11
+ import org .springframework .security .core .context .SecurityContextHolder ;
12
+ import org .springframework .security .core .userdetails .UserDetails ;
13
+ import org .springframework .security .web .authentication .WebAuthenticationDetailsSource ;
14
+ import org .springframework .stereotype .Component ;
15
+ import org .springframework .web .filter .OncePerRequestFilter ;
16
+
17
+ import com .javachinna .service .UserDetailsServiceImpl ;
18
+ import com .javachinna .util .JwtTokenUtil ;
19
+
20
+ import io .jsonwebtoken .ExpiredJwtException ;
21
+ import lombok .RequiredArgsConstructor ;
22
+
23
+ @ Component
24
+ @ RequiredArgsConstructor
25
+ public class JwtRequestFilter extends OncePerRequestFilter {
26
+ private final UserDetailsServiceImpl jwtUserDetailsService ;
27
+ private final JwtTokenUtil jwtTokenUtil ;
28
+
29
+ @ Override
30
+ protected void doFilterInternal (HttpServletRequest request , HttpServletResponse response , FilterChain chain ) throws ServletException , IOException {
31
+ final String requestTokenHeader = request .getHeader ("Authorization" );
32
+ String username = null ;
33
+ String jwtToken = null ;
34
+ // JWT Token is in the form "Bearer token". Remove Bearer word and get
35
+ // only the Token
36
+ if (requestTokenHeader != null ) {
37
+ if (requestTokenHeader .startsWith ("Bearer " )) {
38
+ jwtToken = requestTokenHeader .substring (7 );
39
+ try {
40
+ username = jwtTokenUtil .getUsernameFromToken (jwtToken );
41
+ } catch (IllegalArgumentException e ) {
42
+ System .out .println ("Unable to get JWT Token" );
43
+ } catch (ExpiredJwtException e ) {
44
+ System .out .println ("JWT Token has expired" );
45
+ }
46
+ } else {
47
+ logger .warn ("JWT Token does not begin with Bearer String" );
48
+ }
49
+ }
50
+ // Once we get the token validate it.
51
+ if (username != null && SecurityContextHolder .getContext ().getAuthentication () == null ) {
52
+ UserDetails userDetails = this .jwtUserDetailsService .loadUserByUsername (username );
53
+ // if token is valid configure Spring Security to manually set
54
+ // authentication
55
+ if (jwtTokenUtil .validateToken (jwtToken , userDetails )) {
56
+ UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken (userDetails , null , userDetails .getAuthorities ());
57
+ usernamePasswordAuthenticationToken .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
58
+ // After setting the Authentication in the context, we specify
59
+ // that the current user is authenticated. So it passes the
60
+ // Spring Security Configurations successfully.
61
+ SecurityContextHolder .getContext ().setAuthentication (usernamePasswordAuthenticationToken );
62
+ }
63
+ }
64
+ chain .doFilter (request , response );
65
+ }
66
+ }
0 commit comments