Spring CSRF überschreibt "POST" -Abmeldeverhalten in Sicherheits-XML-Konfiguration

8

Derzeit haben wir ein Problem mit der Spring CSRF-Lösung für unsere Legacy-App, da die CSRF-Implementierung das Verhalten der Spring-Standardsicherheit ändert Spring Sicherheitskonfiguration sis folgt:

%Vor%

org.springframework.security.config.annotation.web.configurers.LogoutConfigurer Logout-Konfigurator. Nach der Frühjahrsdokumentation:

  

Durch das Hinzufügen von CSRF wird der LogoutFilter so aktualisiert, dass er nur HTTP POST verwendet. Dies   stellt sicher, dass die Abmeldung ein CSRF-Token und einen böswilligen Benutzer erfordert   kann Ihre Benutzer nicht zwangsweise abmelden.

Code, der diese Änderung vornimmt, ist der folgende:

%Vor%

Im Allgemeinen ist ein solches Verhalten für den CSRF-Schutz durchaus sinnvoll. Aber für mich ist es sehr seltsam, dass diese Implementierung nicht flexibel ist (warum hardcodiere echte Implementierungen und nicht Autowire-Abhängigkeiten?).

Das Problem ist, dass unsere Anwendung so aufgebaut ist, dass vor der regulären Spring-Abmeldung eine zusätzliche Säuberung in Spring Controllern durchgeführt wird. Hauptsächlich wurde es implementiert Benutzer wechseln Funktion, aber auf eine benutzerdefinierte Weise. Das Ändern der Abmeldeverbindung zum Ausführen von POST ist daher keine Option, da die Bereinigung hauptsächlich auf benutzerdefiniertem Controller ausgeführt wird.

Um den angegebenen Ansatz zu verwenden, scheint es nur eine mögliche Lösung zu geben:

%Vor%

// Wenn entschieden wird, sich abzumelden, wird diese Controller-Methode aufgerufen:

%Vor%

Im Allgemeinen ist dieser Ansatz aus Sicht der Codequalität nicht gut. Also, es gibt zwei Fragen:

  1. Was ist der Grund dafür, solche strengen Implementierungen im Frühling zu machen und keine sichtbare Möglichkeit zu bieten, sie zu überschreiben (speziell habe ich ein Code-Beispiel zur Verfügung gestellt, wie es erstellt wurde)?
  2. Jede gute Alternative, um das erwähnte Problem zu beheben.
user1459144 01.10.2014, 21:38
quelle

3 Antworten

8

Das Verhalten, das Sie beschreiben, ist das Verhalten, wenn Sie die Abmeldeunterstützung nicht explizit konfigurieren, sondern nur aktivieren, indem Sie sie explizit konfigurieren. Stattdessen wird sie diese Konfiguration verwenden.

%Vor%

Dies ist auch dokumentiert im Referenzhandbuch .

Die wirkliche Lösung ist jedoch, dass Sie keinen Controller für die zusätzliche Abmeldefunktion verwenden sollten, aber verwenden Sie LogoutHandler statt. Das wird sich nahtlos in Spring Security integrieren und Sie müssen nicht auf andere URLs umleiten / weiterleiten.

    
M. Deinum 02.10.2014, 06:16
quelle
4

Grundsätzlich bestand die Hauptkomplexität darin, dass der abbrechende logoutFilter im Spring Security XML-Kontext mit der Standardimplementierung von org.springframework.security.web.util.matcher.AntPathRequestMatcher (das mit "GET" - und nicht "POST" -Anforderungen arbeitet) arbeitet. . Um dies zu tun, wurden mehrere Beans zum Sicherheits-XML-Kontext hinzugefügt:

%Vor%

und logout filter selbst:

%Vor%     
user1459144 02.10.2014 19:04
quelle
0

Ich habe den gleichen Fehler nach der Aktualisierung von Internet Explorer 11 gesehen. CsrfConfigururer.class ist nicht null und Post wird beim Abmelden erwartet.

%Vor%

Ich habe mein Problem gelöst, indem ich den Logoutfilter umgangen habe und einen neuen Filter eingefügt habe, um die Sicherheit zu verbessern

Beispiel ist unten.

%Vor%     
Gurkan İlleez 10.01.2018 10:32
quelle

Tags und Links