JWTAuthorizationFilter.java
package com.saltynote.service.security;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.saltynote.service.domain.transfer.JwtUser;
import com.saltynote.service.service.JwtService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.lang.NonNull;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.Collections;
@Component
@RequiredArgsConstructor
public class JWTAuthorizationFilter extends OncePerRequestFilter {
private final JwtService jwtService;
@Override
protected void doFilterInternal(@NonNull HttpServletRequest req, @NonNull HttpServletResponse res,
@NonNull FilterChain chain) throws IOException, ServletException {
String header = req.getHeader(SecurityConstants.AUTH_HEADER);
if (header == null || !header.startsWith(SecurityConstants.TOKEN_PREFIX)) {
chain.doFilter(req, res);
return;
}
UsernamePasswordAuthenticationToken authentication = getAuthentication(req);
SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(req, res);
}
private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
String token = request.getHeader(SecurityConstants.AUTH_HEADER);
if (token == null)
return null;
DecodedJWT decodedJWT = null;
try {
// parse the token.
decodedJWT = jwtService.verifyAccessToken(token);
if (decodedJWT == null) {
return null;
}
}
catch (JWTVerificationException e) {
return null;
}
return new UsernamePasswordAuthenticationToken(
new JwtUser(decodedJWT.getClaim(SecurityConstants.CLAIM_KEY_USER_ID).asString(),
decodedJWT.getSubject()),
null, Collections.emptyList());
}
}