Frühjahr SecurityContext null zurückgeben Authentifizierung auf Fehler-Seiten
Bin ich zu schreiben versucht, eine benutzerdefinierte Fehlerseite für den Fehler 403 (Zugriff verweigert) und 500 (internal server error). Sie würde gerendert werden, die vom Velocity-template und habe alle Nachrichten übersetzt, die Verwendung von Benutzer-Gebietsschema. Authentifizierung und locale-Auflösung funktioniert einwandfrei in der Anwendung.
Habe ich eingerichtet, Lage in web.xml die gewünschte Seite und in webmvc-context.xml ich fügte hinzu, requet-to-view-controller via .
Das problem, das ich gestoßen bin, ist, dass SecurityContextHolder.getContext().getAuthentication() gibt null zurück, die Fehler-Seite anzeigen. Beim Blick auf das log sah ich:
06.10 14:42:26 DEBUG - context.HttpSessionSecurityContextRepository(HttpSessionSecurityContextRepository.java:351) - - SecurityContext stored to HttpSession: 'org.springframework.security.core.context.SecurityContextImpl@ece7b0b7: Authentication: ...
06.10 14:42:26 DEBUG - context.SecurityContextPersistenceFilter(SecurityContextPersistenceFilter.java:89) - - SecurityContextHolder now cleared, as request processing completed
06.10 14:42:26 DEBUG - servlet.DispatcherServlet(DispatcherServlet.java:691) - - DispatcherServlet with name 'foo' processing GET request for [/foo/app/error/403.html]
Also entweder Spring oder Tomcat redirect auf eine Fehlerseite und die Anforderung gest abgeschlossen, so ist der Kontext gelöscht. Und die neue "Anfrage" nicht Unterziehen, Spring Security Filter, damit nicht wieder der Kontext.
Den üblichen Weg nicht funktioniert, aber es scheint, dass die Authentifizierung Informationen, die irgendwo in der session, auch weil AbstractTemplateView meldet Folgendes:
Exposing session attribute 'SPRING_SECURITY_CONTEXT' with value [org.springframework.security.core.context.SecurityContextImpl@edfbd958: Authentication: org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@edfbd958...
Wie kann ich richtig erhalten, so dass die normalen und Fehler-Seiten würde das gleiche handeln?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Des Problems, das Sie laufen in ist, dass die
ExceptionTranslationFilter
was übersetzt Ausnahmen in Fehler-Seiten kommt, bevor dieSecurityContextPersistenceFilter
zieht die Authentifizierung aus derSecurityContextRepository
und steckt es in dieSecurityContextHolder
. Wenn die Anfrage beendet dieSecurityContextPersistenceFilter
nimmt die Informationen wieder aus derSecurityContextHolder
.Den Grund löscht es die
SecurityContextHolder
ist, dass dieSecurityContextHolder
ist in der Regel die thread-lokalen und das servlet-container zur Wiederverwendung eines thread (die meisten tun dies) könnten Sie versehentlich geben diese Anmeldeinformationen an jemand anderes.In der Regel die
ExceptionTranslationFilter
ist die äußerste filtern, um das Risiko zu vermeiden, alle Ausnahmen, die nicht immer übersetzt.Ihre beste Wette wird wahrscheinlich schreiben Sie ein benutzerdefiniertes
ExceptionTranslationFilter
die in denSecurityContextRepository
(oft die HTTP-Sitzung, wie Sie erwähnt) und bietet Zugriff auf dieAuthentication
über dieSecurityContextRepository
und nicht dieSecurityContextHolder
. Beachten Sie, dass dieAuthentication
noch null sein, wenn der Benutzer nicht angemeldet ist.ExceptionTranslationFilter
ist der Mann, der Ausnahmen behandelt werden sollen. Es hataccessDeniedHandler
- Eigenschaft, die standardmäßig eine Instanz vonAccessDeniedHandlerImpl
. Zum Glück hat Sie eineerrorPage
Eigentum und die Dokumentation besagt, dass "als ein "vorwärts", dieSecurityContextHolder
bleiben wird aufgefüllt." Ich rewired meine Bohnen und es funktionierte!Das problem kann sein, dass springSecurityFilterChain ist nicht mit dem abfangen von FEHLERN. Versuchen Sie, Ihre Zuordnung in web.xml zu