2015-02-25 30 views
6

Tôi có dịch vụ REST MVC Spring, với Spring Security (3.2.5.RELEASE) được bật. Khi tôi bật @EnableWebMvcSecurity, biểu mẫu đăng nhập được tự động tạo cho tôi theo số http://localhost:8080/login. Nếu tôi sử dụng biểu mẫu này để đăng nhập, mọi thứ sẽ hoạt động tốt.Dịch vụ nghỉ ngơi mùa xuân - Mã thông báo CSRF không hợp lệ khi tôi cố đăng nhập

Sự cố xảy ra khi tôi cố đăng nhập bằng cách gửi yêu cầu POST trực tiếp. Trong yêu cầu đăng bài của tôi, tôi cung cấp tên người dùng và mật khẩu. Tôi cũng bao gồm tiêu đề http 'X-CSRF-TOKEN' và cho giá trị tiêu đề, tôi sử dụng JSESSIONID mà tôi thấy đã được tạo trong cookie. Nhưng khi tôi gửi yêu cầu POST này, tôi nhận lại kết quả sau:

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

Tôi đang làm gì sai? Tôi có cung cấp giá trị mã thông báo sai không? JSESSIONID này là gì? Nếu tôi không nhập giá trị cho tiêu đề này hoặc bỏ qua tiêu đề tất cả cùng nhau, nó sẽ cho tôi biết "Đã tìm thấy mã thông báo CSRF Null".

Dưới đây là cấu hình Spring an tôi:

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

Tôi thực sự muốn đánh giá cao bất kỳ sự giúp đỡ! Cảm ơn trước!

+0

On thi chặt chẽ hơn của yêu cầu HTTP/phản ứng khi tôi sử dụng biểu mẫu đăng nhập, nó xuất hiện các JSESSIONID là * không * giá trị tôi nên được cung cấp cho tiêu đề X-CSRF-TOKEN. Khi tôi đăng nhập bằng biểu mẫu, tôi thấy mã thông báo CSRF được bao gồm trong yêu cầu. Làm thế nào tôi có được giá trị này Nếu tôi cần đăng nhập một người dùng bằng cách thực hiện các cuộc gọi đến một dịch vụ REST? – AlexG

+0

Giá trị đó có thể đạt được bằng cách trước tiên thực hiện cuộc gọi 'GET' và sau đó 'POST' –

Trả lời

4

Bạn cần gửi mã thông báo csrf khi bạn gửi biểu mẫu đăng nhập. Hãy thêm dòng dưới đây dưới dạng HTML:

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

(1) Bao gồm CSRF token trong tất cả AJAX của bạn yêu cầu.

$(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) yêu cầu đơn giản.

<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> 
Các vấn đề liên quan