Spring MVC (oder Spring Boot). Benutzerdefinierte JSON-Antwort für sicherheitsrelevante Ausnahmen wie 401 Unauthorized oder 403 Forbidden

8

Ich entwickle einen REST-Service. Es verwendet JSON und muss bei Problemen ein vordefiniertes JSON-Objekt zurückgeben. Die Standard-Spring-Antwort sieht folgendermaßen aus:

%Vor%

Ich möchte diesen Standard-JSON durch einen eigenen ersetzen (mit einem Stacktrace und zusätzlichen Informationen zur Ausnahme).

Spring bietet eine praktische Möglichkeit, Standardverhalten zu überschreiben. Man sollte eine @RestControllerAdvice -Bohne mit einem benutzerdefinierten Ausnahmebehandler definieren. So,

%Vor%

Das benutzerdefinierte Objekt ExceptionResponse wird dann von Spring mit einem speziellen Nachrichtenkonverter in JSON konvertiert.

DAS PROBLEM IST , dass Sicherheitsausnahmen wie InsufficientAuthenticationException nicht von einer mit @ExceptionHandler annotierten Methode abgefangen werden können. Diese Art von Ausnahmen tritt auf, bevor das Spring MVC Dispatcher-Servlet eingegeben wurde und alle MVC-Handler initialisiert wurden.

Es ist möglich, diese Ausnahme mit einem benutzerdefinierten Filter abzufangen und eine eigene JSON-Serialisierung von Grund auf neu zu erstellen. In diesem Fall würde man einen Code bekommen, der völlig unabhängig vom Rest der Spring-MVC-Infrastruktur ist. Es ist nicht gut.

Die Lösung, die ich gefunden habe, scheint zu funktionieren, aber es sieht verrückt aus.

%Vor%

Gibt es eine Möglichkeit, die Spring-Serialisierungs-Pipe (mit eingebauten Spring-Message-Konvertern, MIME-Format-Negotiation usw.) zu verwenden, die besser aussieht?

    
30thh 06.12.2017, 17:12
quelle

3 Antworten

1

Erstelle eine Bean-Klasse

%Vor%

und überschreiben Sie commence() method und erstellen Sie eine json-Antwort mit Hilfe des Objekt-Mappers wie im Beispiel

%Vor%

und @Autowire AuthenticationExcetionHandler in SecurityConfiguration class und in configure(HttpSecurity http) method fügen unterhalb von Zeilen hinzu

%Vor%

Auf diese Weise sollten Sie custome json response 401/403 senden können. Wie oben können Sie AccessDeniedHandler verwenden. Lassen Sie uns wissen, ob dies zur Lösung des Problems beigetragen hat.

    
sandeep pandey 10.01.2018 08:38
quelle
0

Frühling bietet Out-of-Box-Unterstützung für die Ausnahmebehandlung über AccessDeniedHandler , die durch folgende unten beschriebene Schritte verwendet werden, kann eine benutzerdefinierte JSON-Antwort im Fall eines AccessDeniedException , dh HTTP 403

Implementieren Sie einen benutzerdefinierten Handler wie etwa unten

%Vor%

Als nächstes eine Bohne von diesem Handler in Config erstellen und liefern es Sicherheits Exception-Handler bis zum Frühjahr ( Wichtiger Hinweis: - gewährleisten /deny von Authentifizierung sonst Anforderung ausschließen unendlich auf halten Fehler behoben )

%Vor%

Als nächstes werden in der Controller-Klasse schreibt einen Handler entsprechend /deny und einfach eine neue Instanz SomeException werfen ( oder ander Exception als geeignet ), die in% abgefangen werden co_de % jeweiliger Handler.

%Vor%

Lassen Sie in Kommentaren wissen, ob weitere Informationen erforderlich sind.

    
Bond - Java Bond 05.01.2018 11:08
quelle
0

Ich denke, die nächste Konfiguration sollte funktionieren, bitte versuchen Sie es.

%Vor%     
Nikita Gorbachevski 06.01.2018 17:42
quelle