Spring Security 3


Spring Secutiry 3


[ AuthenticationEntryPoint ]

인증이 되지 않은 유저가 접근 시 호출된다.

존재하는 경로에 로그인 하지 않고(Header에 JwtToken을 넘기지 않고) 접속할 경우, 호출된다.

@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
	
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
        // 유효한 자격증명을 제공하지 않고 접근하려 할때 401
    	response.addHeader(AuthConstants.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
		response.getWriter().print("JwtAuthenticationEntryPoint Fail");
    }
}


[ AccessDeniedHandler ]

인증이 된 클라이언트 중, 권한이 없는 사용자가 접근 시 호출된다.

@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        response.addHeader(AuthConstants.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
        response.getWriter().print("Authorization Fail");
    }
}


[ OncePerRequestFilter ]

인증 받은(Authenticated) 클라이언트가, 권한이 필요한 URL에 접근 시도 시 호출된다.

✓ 권한 확인 성공 → 정상 로직

x 권한 확인 실패 → AccessDeniedHandler

public class JwtAuthorizationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {

        try {
            String header = request.getHeader("Authorization");
            String token = JwtUtils.getTokenFromHeader(header);
            String authCode = JwtUtils.getClaimsCodeFromToken(token);

            switch (authCode) {
                case "1":
                    authCode = "ROLE_ADMIN";
                    break;
                case "2":
                    authCode = "ROLE_USER";
                    break;
            }

            CustomUserDetail userDetail = 
                        new CustomUserDetail(User.builder().authCode(authCode).build());

            Authentication authentication =
                    new UsernamePasswordAuthenticationToken(null, null, userDetail.getAuthorities();

            SecurityContextHolder.getContext().setAuthentication(authentication);

            chain.doFilter(request, response);

        } catch (NullPointerException e) {
     
            chain.doFilter(request, response);
     
        }
    }
}