Ich habe einen Spring MVC REST-Service mit Spring Security (3.2.5.RELEASE) aktiviert. Wenn ich @EnableWebMvcSecurity einschalte, wird automatisch ein Login-Formular für mich unter http://localhost:8080/login generiert. Wenn ich dieses Formular für die Anmeldung verwende, funktioniert alles einwandfrei.Spring Rest Service - Ungültiges CSRF-Token beim Anmelden
Das Problem tritt auf, wenn ich versuche, mich durch Senden einer POST-Anfrage direkt anzumelden. In meiner Postanfrage stelle ich den Benutzernamen und das Passwort zur Verfügung. Ich schließe auch den HTTP-Header 'X-CSRF-TOKEN' mit ein und für den Header-Wert verwende ich die JSESSIONID, die ich in einem Cookie erzeugt habe. Aber wenn ich diese POST-Anfrage sende, bekomme ich das folgende Ergebnis zurück:
HTTP Status 403 - Invalid CSRF Token '29F5E49EFE8D758D4903C0491D56433E'
was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
Was mache ich falsch? Gebe ich den falschen Token-Wert? Was ist das für JSESSIONID? Wenn ich für diesen Header keinen Wert eingeben oder den Header alle zusammen weglassen, sagt er mir "Null CSRF-Token gefunden".
Unten ist mein Spring Security-Konfiguration:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/secure/**").authenticated()
.and()
.formLogin()
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.and()
.httpBasic()
.and()
.csrf();
}
}
ich wirklich jede Hilfe dankbar würde! Danke im Voraus!
Bei näherer Betrachtung der HTTP-Anforderung/Antwort, wenn ich das Login-Formular verwenden, es erscheint die JSESSIONID ist * nicht * der Wert I für die X-CSRF-Token-Header zur Verfügung stellen soll. Wenn ich mich über das Formular anmelde, sehe ich, dass das CSRF-Token in der Anfrage enthalten ist. Wie würde ich diesen Wert erhalten? Wenn ich mich bei einem Benutzer anmelden muss, indem ich Anrufe an einen REST-Service tätige? – AlexG
Dieser Wert kann erhalten werden, indem zuerst ein 'GET'-Aufruf und dann' POST 'gemacht wird –