본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!
사용자가 인증이 필요한 자원이나, 특정한 권한(인가)가 필요한 자원에 접근하려 할 때, 인증 또는 인가에 실패하면 ExceptionTranslationFilter
가 이를 처리해준다.
크게 하는 일은 2가지 이다.
인증에 실패했을 시 인증 예외 처리를 호출한다. 여기서도 2가지 일을 진행한다.
1. AuthenticationEntryPoint 호출: 로그인 페이지 이동, 401 오류 코드 전달 등
2. 인증 예외가 발생하기 전의 요청 정보를 저장 : 세션에 정보를 넣어놨다가, 로그인 성공 시 원래 접속하려던 url로 리다이렉트 등에 쓰인다.
설정 코드를 보자.
http.exceptionHandling() // 예외 처리 기능 작동
.authenticationEntryPoint(authenticationEntryPoint()) // 인증 실패시 처리
.accessDeniedHandler(accessDeniedHandler()) // 인가 실패시 처리
authenticationEntryPoint()
, accessDeniedHandler()
에는 구현체를 넣으면 된다.
익명 구현체를 사용하면 다음과 같다. 이때 http.successHandler
와 함께 사용한다면 로그인 후 원래 가려던 페이지로 이동할 수 있다. (원래 가려던 페이지 등의 정보는 RequestCache
에 저장되어 있다.)
http.formLogin()
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
RequestCache requestCache = new HttpSessionRequestCache();
SavedRequest savedRequest = requestCache.getRequest(request, response);
String redirectUrl = savedRequest.getRedirectUrl();
response.sendRedirect(redirectUrl);
}
});
http.exceptionHandling() // 예외 처리 기능 작동
.authenticationEntryPoint(new AuthenticationEntryPoint() {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.sendRedirect("/login");
}
})
.accessDeniedHandler(new AccessDeniedHandler() {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
response.sendRedirect("/denied");
}
});
인프런 '스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security' (정수원)