[英]Spring Security denies logout CSRF token
我正在尝试使用本教程来实现Angular应用程序: https : //spring.io/guides/tutorials/spring-security-and-angular-js/
登录工作并执行后续的HTTP调用也可以。 Angular成功地附加了CSRF令牌,而Spring成功地对其进行了解析。 假设令牌为foo
,则请求将包含以下标头:
Cookie:
JSESSIONID=...; XSRF-TOKEN=foo
JSESSIONID=...; XSRF-TOKEN=foo
X-XSRF-TOKEN:
foo
现在,当尝试使用$http.post('logout', {})
,Angular将使用完全相同的标头。 但是,Spring用403回答:
在请求参数'_csrf'或标头'X-CSRF-TOKEN'上发现无效的CSRF令牌'null'。
这是我的安全性配置:
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().and()
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated().and()
.logout().and()
.addFilterBefore(new CsrfHeaderFilter(), CsrfFilter.class);
}
CsrfHeaderFilter是本教程中介绍的类(显然适用于所有其他请求)。
我知道已经晚了两个月,但是我今天遵循的是完全相同的指南,而这个未答复的帖子不断弹出,因此这是解决方案。
基本上,您缺少csrfTokenRepository()
配置程序中的HttpSecurity
csrfTokenRepository()
配置。
Spring CsrfTokenRepository
期望标题为"X-CSRF-TOKEN"
但是Angular在名为"X-XSRF-TOKEN"
的标题中发送令牌,因此指南建议您设置CsrfTokenRepository
实例,该实例期望Angular默认标题为"X-XSRF-TOKEN"
:
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().and()
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated().and()
.logout()
.and()
//This is the first part you were missing
.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterBefore(new CsrfHeaderFilter(), CsrfFilter.class);
}
@Bean
public CsrfTokenRepository csrfTokenRepository(){
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
// This is the second part you were missing
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.