2017-12-11 6 views
1

Ich habe ein Setup, in dem wir JAX-RS/RestEasy zusammen mit Spring Security verwenden. In den meisten Fällen funktioniert es ganz gut, aber ich stolpere in einen unerwarteten Schluckauf mit der Behandlung von Ausnahmen, die von @PreAuthorize ausgelöst werden.JAX-RS und Spring Security @ PreAuthorize Ausnahmebehandlung

Wir tun etwas Erlaubnis Bewertung Spel verwenden, etwa so:

@POST 
@PreAuthorize("@permHandler.canUserUpdate(#request, authentication)") 

diesem Fall wird entweder bewerten zu true oder eine Ausnahme auslösen, UnauthorizedException, mit einigen Informationen.

Das Problem in diesem Fall ist mit der Exception richtig umgehen und den richtigen Fehlercode an den Client zurückgeben.

Ich habe einen typischen JAX-RS Ausdruck Mapper wie so ein:

@Provider 
public static class UnauthorizedExceptionMapper implements ExceptionMapper<UnauthorizedException> { 
    @Override 
    public Response toResponse(UnauthorizedException exception) { 
    ... 
    return Response.status(403).entity(error).build(); 
    } 
} 

Dieser Handler nie getroffen wird, weil @PreAuthorize mein UnauthorizedException nicht sprudeln tut. Stattdessen ist es nicht ganz sicher, was zu tun ist und wirft stattdessen eine IllegalArgumentException. Mapping der IllegalArgumentException, um meine 403 Antwort zu bekommen, wird aus offensichtlichen Gründen nicht wirklich funktionieren.

Gibt es einen akzeptierten Weg, um dies mit dieser Einrichtung zu arbeiten? Die meisten der Dokumentation zur Dokumentation der Ausnahmebehandlung von Spring-Sicherheitsmerkmalen beziehen sich speziell auf Utilities für Spring Web oder Mvc, was hier nicht der Fall ist.

Jede Hilfe oder ein Nicken in die richtige Richtung wäre willkommen.

+0

Ich könnte falsch sein, aber ich dachte, Spring 'Sicherheit auf Methodenebene, '@ PreAuthorize', löst eine' AccessDeniedException' aus. Sie können dies in Ihrer Spring Security Config 'HttpSecurity' mit der' exceptionHandling() 'Methode konfigurieren. – jmw5598

+0

Das ist richtig, wenn '@ PreAuthorize' wahr oder falsch zurückgibt, was hier nicht der Fall ist, wir werfen eine Ausnahme in unser Autorisierungshilfsprogramm. – bvulaj

Antwort

0

Die Lösung, um sicherzustellen, war unsere ExceptionAccessDeniedException erweitert - in diesem Fall Spring Security intelligent genug, um Blase war es, anstatt ein

Beispiel IllegalArgumentException werfen: public class UnauthorizedException extends AccessDeniedException

Verwandte Themen