Frühjahr CSRF überschreiben "POST" logout-Verhalten in Sicherheits-XML-config
Derzeit haben wir ein problem mit der Feder CSRF-Lösung für unser Vermächtnis App, weil CSRF-Umsetzung ändert sich das Verhalten von Standard-Spring security
Spring security-Konfiguration sis folgenden:
<http pattern="">
...
<logout
logout-url="/logout"
delete-cookies="..."
success-handler-ref="logoutSuccessHandler"
/>
<csrf/>
</http>
org.springframework.security.config.annotation.web.configurers.LogoutConfigurer
Logout configurer.
Nach Spring-Dokumentation:
Hinzufügen CSRF-update der LogoutFilter nur HTTP POST verwenden. Diese
sorgt dafür, dass log-out erfordert ein CSRF-token, und dass ein böswilliger Benutzer
nicht zwangsweise Abmelden Ihre Benutzer.
Code, macht diese änderung ist folgende:
private RequestMatcher getLogoutRequestMatcher(H http) {
if(logoutRequestMatcher != null) {
return logoutRequestMatcher;
}
if(http.getConfigurer(CsrfConfigurer.class) != null) {
this.logoutRequestMatcher = new AntPathRequestMatcher(this.logoutUrl, "POST");
} else {
this.logoutRequestMatcher = new AntPathRequestMatcher(this.logoutUrl);
}
return this.logoutRequestMatcher;
}
In der Regel für CSRF-Schutz ein solches Verhalten macht auch Sinn. Aber für mich ist es sehr seltsam, dass diese Implementierung ist nicht flexibel (warum hardcode Reale Implementierungen und nicht autowire Abhängigkeiten?).
Das problem ist, dass unsere Anwendung erstellt wird, in der Weise, dass vor der regelmäßigen Frühjahrs-Abmeldung durchgeführt zusätzliche Reinigung im Frühjahr-Controller. Vor allem wurde es umgesetzt Benutzer WechselnFunktion, sondern in einer benutzerdefinierten Art und Weise. So ändern logout-link durchführen, POST ist keine option, weil vor allem clean-up ausgeführt wird, auf custom Controller.
Scheint es, um Sie zu verwenden angegebenen-Ansatz gibt es nur eine mögliche Lösung:
@RequestMapping(value = "/logout", method = RequestMethod.GET) //or it can be a post
public String logout() {
//1. Perform Clean up
//2. Decide whether to logout or redirect to other page
//3. Perform redirect based on decision
}
//Wenn es ist beschlossen, logout diese gehen dann an diese Controller-Methode:
@RequestMapping(value = "csrflogout", method = RequestMethod.GET)
public void csrfLogout(){
//1 Create manual post request
//2. Copy session information
//3. Perform Post to logout URL that is specified in security xml
}
In der Regel dieser Ansatz ist nicht gut aus der code-Qualität-Perspektive.
Also, es gibt zwei Fragen:
- Was ist der Grund für so strenge Umsetzung im Frühjahr und bieten keine sichtbare Möglichkeit, um es zu überschreiben (ich speziell bereitgestellten code-Beispiel, wie es erstellt wird )?
- Keine gute alternative zu fix genannten problem.
- Warum verwenden Sie einen controller in den ersten Platz? Im Allgemeinen ist es besser, diese Art von Logik in einer LogoutHandler so dass Sie die Integration mit Spring Security nett, anstatt zu versuchen, es zu lösen in einem controller. Auch die POST wird immer noch funktionieren, wenn Sie nach der Bereinigung vorn (nicht umleiten!) der logout URL.
- Auch es gibt nichts verhindern, dass Sie zum konfigurieren der logout verarbeiten, ERHALTEN unabhängig von der CSFR-Schutz, das ist nur die Standardeinstellung, wenn Sie außer Kraft setzen, tun Sie es einfach.
- Können Sie mehr details hinzufügen, wie zum konfigurieren logout behandelt werden, auf die man mit CSRF-Unterstützung (nur post als Antwort zu diesem post)?
- sehen Sie hier ein blue-print: gist.github.com/marcelstoer/c9a894a929c8fe38222a
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Verhalten, das Sie beschreiben, ist das Verhalten, wenn du nicht explizit konfigurieren logout unterstützen, aber nur dann aktivieren, wenn Sie explizit konfigurieren Sie es verwenden, die Konfiguration statt.
Dies ist auch dokumentiert in der Referenz-Anleitung.
Jedoch die richtige Lösung ist imho, dass Sie sollten nicht mit einem controller für die zusätzlichen logout-Funktionalität, sondern in einer LogoutHandler statt. Integrieren wird schön mit Spring Security und Sie brauchen nicht umleiten/weiterleiten auf andere URLs.
LogoutConfigurer
wird nur verwendet, wenn Sie verwenden die java-basierte Konfiguration NICHT für die XML-Konfiguration. Also ich würde sagen, Ihre Frage ist verwirrend. Für XML-ich fürchte, Sie müssen zum konfigurieren derLogoutFilter
manuell statt mithilfe des namespace alsLogoutBeanDefinitionParser
(welche verwendet wird!) immer abwechselnd POSTEN, wenn csfr aktiviert ist.LogoutBeanDefinitionParser
verwendet wird, nicht dieLogoutConfigurer
. Deshalb ist es in derannotation
sub-Paket, das xml-basiert sind diejenigen in derconfig.http
Paket.Grundsätzlich die Haupt-Komplexität wurde in der überwiegenden logoutFilter in der Spring Security-XML Kontext zu der Arbeit mit default-Implementierung von org.springframework.Sicherheit.web.util.matcher.AntPathRequestMatcher (das funktioniert mit "GET" nicht "POST" - requests).
Um dies zu tun, einige Bohnen wurden Hinzugefügt, um die Sicherheit von xml-Kontext:
- und logout-filter selbst:
Sah ich den gleichen Fehler nach Internet Explorer 11 aktualisieren. CsrfConfigurer.class ist nicht null und post ist zu erwarten, wenn Sie sich Abmelden.
Ich mein problem gelöst, unter Umgehung der logoutfilter und setzen Sie neue filter zu spring security
Beispiel ist unten.