33

Ich verwende Spring-Security 3.2.0.RC2 mit Java-Konfiguration. Ich richte eine einfache HttpSecurity-Konfiguration ein, die nach Basic Auth on/v1/** fragt. GET-Anfragen arbeiten, aber POST-Anfragen nicht mit:In Spring-Security mit Java Config, warum httpBasic POST csrf-Token wollen?

HTTP Status 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'. 

Meine Sicherheit Config wie folgt aussehen:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Resource 
private MyUserDetailsService userDetailsService; 

@Autowired 
//public void configureGlobal(AuthenticationManagerBuilder auth) 
public void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
    StandardPasswordEncoder encoder = new StandardPasswordEncoder(); 
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder); 
} 

@Configuration 
@Order(1) 
public static class RestSecurityConfig 
     extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatcher("/v1/**").authorizeRequests() 
       .antMatchers("/v1/**").authenticated() 
      .and().httpBasic(); 
    } 
} 

} 

Jede Hilfe zu diesem Thema sehr geschätzt.

+1

Wenn Sie csrf deaktivieren dan't wollen (da sie es für einen Grund ist) könnte man hinzufügen ein verstecktes Feld mit dem csrf-Wert und füge den Wert hinzu, den starmandeluxe in dem angenommenen Beitrag vorschlägt. Dies funktionierte gut für mich, ohne csrf zu deaktivieren – Xtroce

+0

@ Xtroce ist richtig, obwohl in meinem Fall musste ich 'X-CSRF-TOKEN' zu den Ajax Post * Header * hinzufügen. (Das Hinzufügen von '_csrf' zu den Ajax-Post * -Parametern * hat nicht funktioniert.) – inanutshellus

+0

Wenn Sie zum @Xtroce-Kommentar hinzufügen, können Sie thormeleaf für das Templating verwenden, indem Sie

und die Vorlagen-Engine stellt automatisch ein verstecktes Eingabefeld namens" _csrf "bereit, das mit dem korrekten Wert gefüllt wird. –

Antwort

53

CSRF Schutz ist standardmäßig mit Java-Konfiguration aktiviert. Um es zu deaktivieren:

@Configuration 
public class RestSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .csrf().disable() 
      ...; 
    } 
} 
+5

Also, die offensichtliche Frage ist, wenn er es nicht deaktiviert, was war sein Problem mit dem Nullwert? Ich habe das gleiche Problem und bremse den CSRF-Schutz meines Wissens nicht. – starmandeluxe

+1

@starmandeluxe Wenn der CSRF-Schutz aktiviert ist, erwartet Spring Security bei der Verwendung von POST ein CSRF-Token vom Client. Wenn der Client ein solches Token nicht sendet, ist es null, was bedeutet, dass es fehlt. – holmis83

+1

Oh, aber ich sende meinen AJAX-Aufruf: vorSenden: Funktion (xhr) { \t \t \t xhr.setRequestHeader ('X-CSRF-Token', $ ("Meta [Name = '_ csrf']"). Attr ('Inhalt')); – starmandeluxe

5

Sie können auch die CSRF-Check nur auf einige Anfragen oder Methoden deaktivieren, mit einer Konfiguration wie folgt für die http Objekt:

http 
    .csrf().requireCsrfProtectionMatcher(new RequestMatcher() { 

    private Pattern allowedMethods = 
     Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$"); 

    private RegexRequestMatcher apiMatcher = 
     new RegexRequestMatcher("/v[0-9]*/.*", null); 

    @Override 
    public boolean matches(HttpServletRequest request) { 
     // CSRF disabled on allowedMethod 
     if(allowedMethods.matcher(request.getMethod()).matches()) 
      return false; 

     // CSRF disabled on api calls 
     if(apiMatcher.matches(request)) 
      return false; 

     // CSRF enables for other requests 
     return true; 
    } 
}); 

Sie mehr sehen hier :

http://blog.netgloo.com/2014/09/28/spring-boot-enable-the-csrf-check-selectively-only-for-some-requests/