Behandeln Sie Ausnahmen für die Sicherheitsauthentifizierung im Frühjahr mit @ExceptionHandler

Ich benutze Spring MVC's@ControllerAdvice und@ExceptionHandler alle Ausnahmen einer REST-API behandeln. Es funktioniert gut für Ausnahmen, die von Web-MVC-Controllern ausgelöst werden, aber nicht für Ausnahmen, die von benutzerdefinierten Spring-Sicherheitsfiltern ausgelöst werden, da diese ausgeführt werden, bevor die Controller-Methoden aufgerufen werden.

Ich habe einen benutzerdefinierten Spring-Sicherheitsfilter, der eine tokenbasierte Authentifizierung ausführt:

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

        }

    }

}

Mit diesem benutzerdefinierten Einstiegspunkt:

@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());
    }

}

Und mit dieser Klasse können Sie Ausnahmen global behandeln:

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

Ich muss lediglich einen detaillierten JSON-Body zurückgeben, auch für die AuthenticationException für die Frühjahrssicherheit. Gibt es eine Möglichkeit, die spring security AuthenticationEntryPoint und spring mvc @ExceptionHandler zusammenarbeiten zu lassen?

Ich benutze Spring Security 3.1.4 und Spring MVC 3.2.4.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage