33

Utilizzo Spring-Security 3.2.0.RC2 con configurazione Java. Ho configurato una semplice configurazione di HttpSecurity che richiede l'autenticazione di base su/v1/**. richieste GET funzionano, ma le richieste POST non riescono con:In Spring-Security con Java Config, perché HTTPBasic POST desidera il token csrf?

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

mio config di sicurezza si presenta così:

@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(); 
    } 
} 

} 

Qualsiasi aiuto su questo molto apprezzato.

+1

Se si desidera disabilitare dan't CSRF (dal momento che è lì per un motivo) si potrebbe aggiungere un campo nascosto con il valore csrf e aggiungi il valore come suggerisce starmandeluxe nel post accettato. Questo ha funzionato bene per me, senza disabilitare csrf – Xtroce

+0

@Xtroce ha ragione, anche se nel mio caso ho dovuto aggiungere 'X-CSRF-TOKEN' alle intestazioni * del post dell'ajax *. (L'aggiunta di '_csrf' al parametro dell'ajax * parametri * non ha funzionato.) – inanutshellus

+0

Aggiunta al commento @Xtroce, se si utilizza thymeleaf per il template, è possibile aggiungere

e il motore di template fornirà automaticamente un campo di input nascosto denominato" _csrf "popolato con il valore corretto. –

risposta

53

CSRF protezione attivata per impostazione predefinita con configurazione Java. Per disabilitarlo:

@Configuration 
public class RestSecurityConfig extends WebSecurityConfigurerAdapter { 

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

Quindi, la domanda ovvia è, se non lo disabilita, qual era il suo problema con il valore nullo? In realtà sto avendo lo stesso problema e non sto disabilitando la protezione CSRF per quanto ne so. – starmandeluxe

+1

@starmandeluxe Quando la protezione CSRF è abilitata, Spring Security prevede un token CSRF dal client quando si utilizza il POST. Se il client non invia un tale token, sarà nullo, il che significa che manca. – holmis83

+1

Oh, ma io mando nel mio AJAX chiamata: beforeSend:. Funzione (XHR) { \t \t \t xhr.setRequestHeader ('X-CSRF-token', $ ("meta [name = '_ CSRF']") attr ('soddisfare')); – starmandeluxe

5

È inoltre possibile disattivare il controllo di CSRF solo su alcune richieste o metodi, utilizzando una configurazione simile alla seguente per l'oggetto http:

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; 
    } 
}); 

Si può vedere di più qui :

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