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:

  1. 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 )?
  2. 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
InformationsquelleAutor user1459144 | 2014-10-01
Schreibe einen Kommentar