33

Tôi đang sử dụng Spring-Security 3.2.0.RC2 với cấu hình Java. Tôi thiết lập cấu hình HttpSecurity đơn giản yêu cầu auth cơ bản trên/v1/**. yêu cầu GET làm việc nhưng yêu cầu POST thất bại với:Trong Spring-Security với Java Config, tại sao httpBasic POST muốn mã thông báo csrf?

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

cấu hình an ninh của tôi trông như thế này:

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

} 

Bất kỳ giúp đỡ về vấn đề này đánh giá rất cao.

+1

Nếu bạn không muốn tắt csrf (vì lý do đó) bạn có thể thêm một trường ẩn với giá trị csrf và thêm giá trị như starmandeluxe gợi ý trong bài đăng được chấp nhận. Điều này làm việc tốt cho tôi, mà không vô hiệu hóa csrf – Xtroce

+0

@Xtroce là đúng, mặc dù trong trường hợp của tôi, tôi đã phải thêm 'X-CSRF-TOKEN' vào tiêu đề * bài * *. (Thêm '_csrf' vào bài đăng * tham số * không hoạt động.) – inanutshellus

+0

Thêm vào nhận xét @Xtroce, nếu bạn sử dụng thymeleaf cho templating, bạn có thể thêm

và công cụ mẫu sẽ tự động cung cấp trường nhập ẩn có tên" _csrf "được điền bằng giá trị chính xác. –

Trả lời

53

CSRF bảo vệ được bật theo mặc định với cấu hình Java. Để vô hiệu hóa nó:

@Configuration 
public class RestSecurityConfig extends WebSecurityConfigurerAdapter { 

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

Vì vậy, câu hỏi rõ ràng là, nếu anh ta không vô hiệu hóa nó, vấn đề của anh ta với giá trị null là gì? Tôi thực sự có cùng một vấn đề và tôi không vô hiệu hóa bảo vệ CSRF theo như tôi biết. – starmandeluxe

+1

@starmandeluxe Khi bảo vệ CSRF được kích hoạt, Spring Security mong đợi một mã thông báo CSRF từ máy khách khi sử dụng POST. Nếu khách hàng không gửi một mã thông báo như vậy, nó sẽ là rỗng, có nghĩa là bị thiếu. – holmis83

+1

Ồ, nhưng tôi đang gửi trong cuộc gọi AJAX của tôi: beforeSend: function (xhr) { \t \t \t xhr.setRequestHeader ('X-CSRF-Token', $ ("meta [name = '_ csrf']"). ('Nội dung')); – starmandeluxe

5

Bạn cũng có thể vô hiệu hóa việc kiểm tra CSRF chỉ trên một số yêu cầu hoặc các phương pháp, sử dụng cấu hình như sau cho các http đối tượng:

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

Bạn có thể xem chi tiết tại đây :

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

Các vấn đề liên quan