Obecnie mamy problem z roztworu Wiosna CSRF dla naszej spuścizny App ponieważ realizacja CSRF zmienia zachowanie domyślne Wiosna zabezpieczeń konfiguracji zabezpieczeń wiosennym sis następujący:Wiosna CSRF override „POST” zachowanie wylogowania w XML bezpieczeństwo config
<http pattern="">
...
<logout
logout-url="/logout"
delete-cookies="..."
success-handler-ref="logoutSuccessHandler"
/>
<csrf/>
</http>
org.springframework.security.config.annotation.web.configurers.LogoutConfigurer
Wylogowanie configurer. Zgodnie z dokumentacją Spring:
Dodanie CSRF zaktualizuje LogoutFilter tak, aby korzystał tylko z HTTP POST. Ten numer zapewnia, że wylogowanie wymaga tokena CSRF, a złośliwy użytkownik nie może wymusić wylogowania użytkowników.
kod sprawia, że ta zmiana jest następująca:
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;
}
Ogólnie o ochronę CSRF takie zachowanie ma sens. Ale co do mnie, to bardzo dziwne, że ta implementacja nie jest elastyczna (dlaczego używasz hardcode do prawdziwych implementacji i nie zależy od autoworów?).
Problem polega na tym, że nasza aplikacja została zbudowana w taki sposób, że przed regularnym wylogowaniem wiosennym wykonano dodatkowe czyszczenie w kontrolerach sprężynowych. Głównie została zaimplementowana funkcja Switch User, ale w niestandardowy sposób. Tak więc zmiana łącza wylogowania w celu wykonania POST nie jest opcją, ponieważ głównie czyszczenie odbywa się na niestandardowym kontrolerze.
Wydaje się, aby użyć określonego podejścia jest tylko jednym z możliwych rozwiązań:
@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
}
// Jeśli zdecydował się wylogować ten trafi do tej metody Kontroler:
@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
}
Generalnie podejście nie jest dobre z perspektywy jakości kodu. Tak, istnieją dwa pytania:
- Jaki jest powód, aby dokonać takiego ścisłego wdrożenia na wiosnę i nie dostarczają żadnych widocznych możliwość, aby go zastąpić (w szczególności I, pod warunkiem przykład kodu, jak to utworzone)?
- Dobra alternatywa dla naprawienia wspomnianego problemu.
Dlaczego w ogóle korzystasz z kontrolera? Ogólnie rzecz biorąc, lepiej jest umieścić taką logikę w [LogoutHandler] (http://docs.spring.io/autorepo/docs/spring-security/current/apidocs/org/springframework/security/web/authentication/logout /LogoutHandler.html) w taki sposób, aby ładnie zintegrować się z programem Spring Security, zamiast próbować go rozwiązać w kontrolerze. Również POST będzie działał, jeśli po oczyszczeniu w przód (nie przekierowaniu!) Do adresu URL wylogowania. –
Również nie ma nic, co uniemożliwiłoby skonfigurowanie wylogowania do obsługi GET bez względu na ochronę CSFR, jest to tylko domyślne, jeśli nadpisujesz to po prostu zrób. –
Czy możesz dodać więcej szczegółów, jak skonfigurować wylogowanie, które ma być obsługiwane w usłudze GET z obsługą CSRF (wystarczy opublikować jako odpowiedź na ten wpis)? – user1459144