33

Używam Spring-Security 3.2.0.RC2 z konfiguracją Java. Konfiguruję prostą konfigurację HttpSecurity, która prosi o podstawowe uwierzytelnianie/v1/**. żądania GET działa, ale nie z żądania POST:W Spring-Security z Java Config, dlaczego httpBasic POST chce tokenu csrf?

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

Mój config bezpieczeństwo wygląda następująco:

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

} 

Każda pomoc w tej sprawie bardzo mile widziane.

+1

Jeśli dan't chcesz wyłączyć CSRF (ponieważ jest tam bez powodu) można dodać ukryte pole z wartością csrf i dodaj wartość, jaką sugeruje starmandeluxe w przyjętym poście. To działało dobrze dla mnie, bez wyłączania csrf – Xtroce

+0

@Xtroce ma rację, chociaż w moim przypadku musiałem dodać 'X-CSRF-TOKEN' do nagłówków ajax post *. (Dodanie '_csrf' do parametrów posta ajax * nie zadziałało.) – inanutshellus

+0

Dodanie komentarza @Xtroce, jeśli użyjesz thymeleaf do szablonów, możesz dodać

i mechanizm szablonów automatycznie dostarczy ukryte pole wejściowe o nazwie" _csrf "wypełnione poprawną wartością. –

Odpowiedz

53

CSRF Ochrona jest domyślnie włączona w konfiguracji Java. Aby ją wyłączyć:

@Configuration 
public class RestSecurityConfig extends WebSecurityConfigurerAdapter { 

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

Tak więc oczywistym pytaniem jest, czy nie wyłącza go, jaki był jego problem z wartością pustą? W rzeczywistości mam ten sam problem i nie wyłączam ochrony CSRF, o ile wiem. – starmandeluxe

+1

@starmandeluxe Gdy ochrona CSRF jest włączona, Spring Security oczekuje od klienta tokenu CSRF podczas korzystania z testu POST. Jeśli klient nie wyśle ​​takiego tokena, będzie on pusty, co oznacza brak. – holmis83

+1

Och, ale wysyłam moje wywołanie AJAX: beforeSend: function (xhr) { \t \t \t xhr.setRequestHeader ("X-CSRF-Token", $ ("meta [nazwa = '_ csrf']"). ('zadowolony')); – starmandeluxe

5

Można również wyłączyć sprawdzanie CSRF tylko na niektórych wniosków lub metod, stosując konfigurację jak następuje dla obiektu 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; 
    } 
}); 

widać więcej tutaj :

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