繁体   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