[英]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.