我有一个Spring MVC REST服务,启用了Spring Security(3.2.5.RELEASE)。当我打开@EnableWebMvcSecurity时,会在http://localhost:8080/login为我自动生成一个登录表单。如果我使用此表单登录,一切正常。
当我尝试通过直接发送POST请求进行登录时,会出现问题。在我的帖子请求中,我提供了用户名和密码。我还包括http标头' X-CSRF-TOKEN'对于标头值,我使用我看到的JSESSIONID已在cookie中生成。但是当我发送这个POST请求时,我得到了以下结果:
HTTP Status 403 - Invalid CSRF Token '29F5E49EFE8D758D4903C0491D56433E'
was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
我做错了什么?我提供了错误的令牌价值吗?这是什么JSESSIONID?如果我没有输入此标题的值,或者一起省略标题,则会告诉我"找到空的CSRF令牌"。
以下是我的Spring Security配置:
@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();
}
}
我非常感谢任何帮助!提前谢谢!
答案 0 :(得分:5)
(1)在所有AJAX请求中包含CSRF令牌。
$(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)简单请求。
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
答案 1 :(得分:4)
您需要在提交登录表单时发送csrf
令牌。请在HTML表单中添加以下行:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
答案 2 :(得分:0)
您需要<meta name="_csrf" content="${_csrf.token}"/>
,https://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/#ajax-requests
或者如果您使用的是thymeleaf <meta name="_csrf" th:content="${_csrf.token}" />