6

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!

+0

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

+0

Dieser Wert kann erhalten werden, indem zuerst ein 'GET'-Aufruf und dann' POST 'gemacht wird –

Antwort

4

Sie müssen das Token csrf senden, wenn Sie das Anmeldeformular absenden. Bitte fügen Sie die folgende Zeile in dem HTML-Formular:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 
4

(1) Fügen Sie die CSRF-Token in alle Ihrem AJAX Anfragen.

$(function() { 
    var token = $('#logoutform>input').val(); 
    var header = $('#logoutform>input').attr('name'); 
    $(document).ajaxSend(function(e, xhr, options) { 
     xhr.setRequestHeader('X-CSRF-TOKEN', token); 
    }); 
}); 

(2) Einfache Anfrage.

<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> 
Verwandte Themen