Spring/Spring Security

Spring Security (7) - ExceptionTranslationFilter

ExceptionTranslationFilter

  • AbstractSecurityInterceptor 의 하위 클래스에서 AuthenticationException 타입의 예외가 발생하면 처리하는 필터입니다.

  • 처리할 수 있는 예외가 발생하였다면 (AuthenticationException, AccessDeniedException) 인증과 인가에 대한 처리를 해줍니다.

    1. 인증실패 - sendStartAuthentication 메소드 호출
    2. 인가실패
      2-1. 익명사용자(비로그인) : sendStartAuthentication 메소드 호출
      2-2. 로그인 사용자 : accessDeniedHandler 에게 처리를 위임

    • 인가 실패 핸들러 커스텀 구현
      http.exceptionHandling()
        .accessDeniedHandler((request, response, accessDeniedException) -> {
            UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            String username = principal.getUsername();
            response.sendRedirect("/access-denied");
        }); // 핸들러를 구현하여 인가 실패에 대한 처리

    UsernamePasswordAuthenticationFilter 의 인증실패 예외처리

    • UsernamePasswordAuthenticationFilter 에서 발생하는 인증실패 예외는 해당 필터의 상위 클래스에서 처리한다.
    • AbstractAuthenticationProcessingFilter 의 unsuccessfulAuthentication 에서 SimpleUrlAuthenticationFailureHandler 의 onAuthenticationFailure 를 호출하고, 같은 클래스의 saveException 에서 세션에 에러를 저장하여 로그인 관련 필터로 처리를 위임한다.