SpringSecurity를 설정하다보니 Method레벨(global-method-security)에서의 AccessDeniedException은 그 전에 설정해놓은 <access-denied-handler>에 걸리지 않는 것을 알게 되었다.


왜 그런가 찾다보니 스택오버플로우[1]에서 답을 찾았는데

내 상황이 답을 준것처럼 처리하기에는 정확히 맞지 않는 상황이었다.


- StackOverFlow 번역 -

access-denied-handler는 AccessDeniedException가 발생할 때 ExceptionTranslationFilter에 의해 사용됩니다.

그러나 org.springframework.web.servlet.DispatcherServlet은 먼저 예외 처리를 시도했다.

특히 defaultErrorView로 정의 된 org.springframework.web.servlet.handler.SimpleMappingExceptionResolver가 있는데, 결과적으로 SimpleMappingExceptionResolver는 적절한 뷰로 리디렉션하여 예외를 소비하므로 결과적으로 ExceptionTranslationFilter에 버블링 될 예외가 없습니다.


수정은 간단했다. 모든 AccessDeniedException을 무시하도록 SimpleMappingExceptionResolver를 구성하십시오.


applicationContext.xml


이제는 AccessDeniedException이 발생할 때마다 SimpleMappingExceptionResolver를 무시하고 ExceptionTranslationFilter를 통해 예외 처리를 하게 됩니다.



- 내 해결 방식 -

내 프로젝트에서는 위와 같이 설정하기 난해한 부분이 있어서 중복이여서 아쉽지만 web.xml에 이동 페이지를 설정하게 해주었다.


web.xml



Reference

[1] Spring Security ignoring access-denied-handler with Method Level Security (http://stackoverflow.com/questions/21171882/spring-security-ignoring-access-denied-handler-with-method-level-security)



Leave a Comment


to Top