簡體   English   中英

Spring Security拒絕注銷CSRF令牌

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM