1414
1515package com .crapi .config ;
1616
17+ import com .crapi .constant .UserMessage ;
1718import com .crapi .enums .EStatus ;
1819import com .crapi .service .Impl .UserDetailsServiceImpl ;
1920import jakarta .servlet .FilterChain ;
3132import org .springframework .security .web .authentication .WebAuthenticationDetailsSource ;
3233import org .springframework .web .filter .OncePerRequestFilter ;
3334
35+ enum ApiType {
36+ JWT ,
37+ APIKEY ;
38+ }
39+
3440public class JwtAuthTokenFilter extends OncePerRequestFilter {
3541
3642 private static final Logger tokenLogger = LoggerFactory .getLogger (JwtAuthTokenFilter .class );
@@ -55,11 +61,21 @@ protected void doFilterInternal(
5561 String username = getUserFromToken (request );
5662 if (username != null && !username .equalsIgnoreCase (EStatus .INVALID .toString ())) {
5763 UserDetails userDetails = userDetailsService .loadUserByUsername (username );
58- UsernamePasswordAuthenticationToken authentication =
59- new UsernamePasswordAuthenticationToken (
60- userDetails , null , userDetails .getAuthorities ());
61- authentication .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
62- SecurityContextHolder .getContext ().setAuthentication (authentication );
64+ if (userDetails == null ) {
65+ tokenLogger .error ("User not found" );
66+ response .sendError (HttpServletResponse .SC_UNAUTHORIZED , UserMessage .INVALID_CREDENTIALS );
67+ }
68+ if (userDetails .isAccountNonLocked ()) {
69+ UsernamePasswordAuthenticationToken authentication =
70+ new UsernamePasswordAuthenticationToken (
71+ userDetails , null , userDetails .getAuthorities ());
72+ authentication .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
73+ SecurityContextHolder .getContext ().setAuthentication (authentication );
74+ } else {
75+ tokenLogger .error (UserMessage .ACCOUNT_LOCKED_MESSAGE );
76+ response .sendError (
77+ HttpServletResponse .SC_UNAUTHORIZED , UserMessage .ACCOUNT_LOCKED_MESSAGE );
78+ }
6379 }
6480 } catch (Exception e ) {
6581 tokenLogger .error ("Can NOT set user authentication -> Message:%d" , e );
@@ -70,27 +86,47 @@ protected void doFilterInternal(
7086
7187 /**
7288 * @param request
73- * @return jwt token
89+ * @return key/ token
7490 */
75- public String getJwt (HttpServletRequest request ) {
91+ public String getToken (HttpServletRequest request ) {
7692 String authHeader = request .getHeader ("Authorization" );
7793
7894 // checking token is there or not
79- if (authHeader != null && authHeader .startsWith ( "Bearer " ) ) {
80- return authHeader .replace ( "Bearer " , "" );
95+ if (authHeader != null && authHeader .length () > 7 ) {
96+ return authHeader .substring ( 7 );
8197 }
8298 return null ;
8399 }
84100
101+ /**
102+ * @param request
103+ * @return api type from HttpServletRequest
104+ */
105+ public ApiType getKeyType (HttpServletRequest request ) {
106+ String authHeader = request .getHeader ("Authorization" );
107+ ApiType apiType = ApiType .JWT ;
108+ if (authHeader != null && authHeader .startsWith ("ApiKey " )) {
109+ apiType = ApiType .APIKEY ;
110+ }
111+ return apiType ;
112+ }
113+
85114 /**
86115 * @param request
87116 * @return return username from HttpServletRequest if request have token we are returning username
88117 * from request token
89118 */
90119 public String getUserFromToken (HttpServletRequest request ) throws ParseException {
91- String jwt = getJwt (request );
92- if (jwt != null && tokenProvider .validateJwtToken (jwt )) {
93- String username = tokenProvider .getUserNameFromJwtToken (jwt );
120+ ApiType apiType = getKeyType (request );
121+ String token = getToken (request );
122+ String username = null ;
123+ if (token != null ) {
124+ if (apiType == ApiType .APIKEY ) {
125+ username = tokenProvider .getUserNameFromApiToken (token );
126+ } else {
127+ tokenProvider .validateJwtToken (token );
128+ username = tokenProvider .getUserNameFromJwtToken (token );
129+ }
94130 // checking username from token
95131 if (username != null ) return username ;
96132 }
0 commit comments