저는 Spring MVC를 사용 @ControllerAdvice
하고 @ExceptionHandler
있으며 REST Api의 모든 예외를 처리합니다. 웹 mvc 컨트롤러에서 throw 된 예외에 대해서는 잘 작동하지만 컨트롤러 메서드가 호출되기 전에 실행되기 때문에 스프링 보안 사용자 지정 필터에 의해 throw 된 예외에 대해서는 작동하지 않습니다.
토큰 기반 인증을 수행하는 사용자 지정 스프링 보안 필터가 있습니다.
public class AegisAuthenticationFilter extends GenericFilterBean {
...
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
try {
...
} catch(AuthenticationException authenticationException) {
SecurityContextHolder.clearContext();
authenticationEntryPoint.commence(request, response, authenticationException);
}
}
}
이 사용자 지정 진입 점 사용 :
@Component("restAuthenticationEntryPoint")
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authenticationException.getMessage());
}
}
이 클래스를 사용하여 예외를 전역 적으로 처리합니다.
@ControllerAdvice
public class RestEntityResponseExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ InvalidTokenException.class, AuthenticationException.class })
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
@ResponseBody
public RestError handleAuthenticationException(Exception ex) {
int errorCode = AegisErrorCode.GenericAuthenticationError;
if(ex instanceof AegisException) {
errorCode = ((AegisException)ex).getCode();
}
RestError re = new RestError(
HttpStatus.UNAUTHORIZED,
errorCode,
"...",
ex.getMessage());
return re;
}
}
내가해야 할 일은 스프링 보안 AuthenticationException에 대해서도 상세한 JSON 본문을 반환하는 것입니다. 스프링 보안 AuthenticationEntryPoint와 spring mvc @ExceptionHandler가 함께 작동하는 방법이 있습니까?
저는 스프링 보안 3.1.4와 스프링 mvc 3.2.4를 사용하고 있습니다.
(@)ExceptionHandler
요청이에서 처리되는 경우에만 작동합니다DispatcherServlet
. 그러나이 예외는Filter
. 따라서이 예외는(@)ExceptionHandler
.