작성
·
259
0
안녕하세요 강의 잘 보고 있습니다. 다름이 아니라 예외를 처리하는 부분에서 이해가 잘 가지 않는 부분이 이렇게 질문을 드립니다.
스프링 시큐리티의 FilterChainProxy의 끝단에 예외를 처리하는 ExceptionTranslationFilter가 존재합니다. 해당 필터가 인가 예외를 처리하는 것까지는 이해하였습니다.
그러나 인증예외를 다루는 것이 조금 이해가 가지 않습니다.
스프링 시큐리티에서 제공하는 formLogin 인증을 포함한 모든 인증 방식은 ExceptionTranslationFilter앞에 존재합니다.
그럼에도 불구하고 인증 필터들에서 발생하는 예외들을 ExceptionTranslationFilter에서 처리를 합니다. 기존의 저는 예외가 발생할 즉시 바로 자신을 호출한 객체에게 예외를 반환하며 프로세스가 진행한다 알고 있는데 이는 스프링 시큐리티에서 인증예외를 처리하는 흐름과는 정 반대의 흐름입니다.
혹시 인증 필터에서 해당 예외가 발생할시 예외를 Throw하는 것이 아닌 다른방식으로 예외를 감싸서 ExceptionTranslationFilter까지 흘러가는 건가요? 아니면 제가 놓치는 부분이 있는걸까요?
답변 2
1
네 이부분은 ExceptionTranslationFilter 챕터에서 설명하고 있습니다.
ExceptionTranslationFilter 는 AuthorizationFilter 에서 발생한 예외를 처리하고 있습니다.
즉 ExceptionTranslationFilter 이전 필터들에서 발생하는 예외를 처리하지 않습니다.
ExceptionTranslationFilter 이전 필터들에서 발생하는 예외는 해당 필터에서 예외를 처리하거나 그 이전필터에게 예외를 전가하는 식으로 이루어집니다
그래서 formLogin 에서 발생하는 예외는 UsernamePasswordAuthenticationFilter 에서 처리합니다.
강의에서도 설명하고 있으니 참고 해 주시기 바랍니다.
0
제 생각에는 AuthorizationFilter
에서 AccessDeniedException
예외를 던지지만, 또한 AuthenticationCredentialsNotFoundException
예외도 던지는 로직이 있습니다(AuthenticationCredentialsNotFoundException
예외는 AuthenticationException
하위 예외입니다). 해당 예외를 ExceptionTranslationFilter
가 처리하므로 인증 예외를 처리한다고 설명하신게 아닐까 싶습니다.
AuthenticationCredentialsNotFoundException
예외는 AuthorizationFilter
의 getAuthentication()
메서드에, 해당 예외를 ExceptionTranslationFilter
가 처리하는 부분은 doFilter()
메서드 내부에서 (AuthenticationException) 형변환을 하는 부분을 살펴보시면 쉽게 이해하실 듯 합니다.
감사합니다 :)