Обрабатывать исключительные ситуации аутентификации безопасности с помощью @ExceptionHandler

м с использованием Spring MVC@ControllerAdvice а также@ExceptionHandler обрабатывать все исключения REST Api. Он отлично работает для исключений, создаваемых веб-контроллерами mvc, но не работает для исключений, создаваемых настраиваемыми фильтрами Spring Security, поскольку они запускаются до вызова методов контроллера.

У меня есть собственный фильтр безопасности Spring, который выполняет аутентификацию на основе токена:

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;
    }
}

Что мне нужно сделать, это вернуть подробное тело JSON даже для весенней безопасности AuthenticationException. Есть ли способ заставить Spring Security AuthenticationEntryPoint и spring mvc @ExceptionHandler работать вместе?

м с использованием пружинной безопасности 3.1.4 и пружинного мвк 3.2.4.

Ответы на вопрос(8)

Ваш ответ на вопрос