当前位置: 首页 > 知识库问答 >
问题:

Spring Security性拒绝注销CSRF令牌

凌宏大
2023-03-14

我试图使用以下教程实现一个Angular应用程序:https://spring.io/guides/tutorials/spring-security-and-angull-js/

登录和执行后续HTTP调用也同样有效。Angular成功地追加了CSRF令牌,Spring成功地解析了它。假设令牌为foo,则请求将包含以下头部:

cookie:jsessionid=...;xsrf-token=foo

protected void configure(HttpSecurity http) throws Exception {
    http
        .httpBasic().and()
        .authorizeRequests()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated().and()
        .logout().and()
        .addFilterBefore(new CsrfHeaderFilter(), CsrfFilter.class);
}

CsrfHeaderFilter是教程中解释的类(它显然适用于所有其他请求)。

共有1个答案

黎承颜
2023-03-14

我意识到它晚了两个月,但我今天遵循了完全相同的指南,这篇未回复的帖子不断弹出,所以这里是解决方案。

基本上,HttpSecurity配置程序中缺少CSRFTokenRepository()配置

Springcsrftokenrepository需要标头“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;
}
 类似资料:
  • 我正在学习springsecurity(基于java的配置),我无法使注销正常工作。当我点击注销时,我看到URL更改为http://localhost:8080/logout并获取“HTTP 404-/logout”。登录功能工作正常(即使使用自定义登录表单),但问题是注销,我怀疑重定向的url“localhost:8080/logout”应该类似于“localhost:8808/springte

  • 重复的步骤 登录 注销 从服务器登录并获取422无法验证CSRF令牌的真实性 Gems 设计3.5.2 设计令牌\u验证0.1.36 根据其他线程,解决方案是在注销时返回一个新的csrf令牌,然后在客户端的注销成功处理程序中,将XSRF-TOKEN的cookie设置为接收的令牌。我使用的代码如下。有人能告诉我为什么它不起作用吗?最后一个登录请求看起来使用了新的令牌,所以棱角分明的看起来像是从coo

  • 问题内容: 如果在application_controller中提到了该选项,那么我可以登录并执行任何GET请求,但是在第一个POST请求上,Rails重置了会话,这使我注销。 我暂时关闭了该选项,但希望将其与Angular.js一起使用。有什么办法吗? 问题答案: 我认为从DOM读取CSRF值不是一个好的解决方案,这只是一种解决方法。 这是angularJS官方网站http://docs.ang

  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 嗨,我正在创建使用 REST API endpoint与服务器端通信的移动本机应用程序。 我以前有开发本机客户端的经验,但我将简单的令牌(随机生成的字符串)存储在存储用户信息的同一表中的数据库中。所以它就像浏览器中使用的会话,但每个请求的标头中都有令牌,而不是 cookie。 最近我发现了JWT令牌。这似乎是保护私有endpoint的好方法。您可以从移动客户端请求令牌,前提是您通过登录并获得生成的

  • 问题内容: 我用了 然后我导入数据库,它显示一个错误: 问题答案: 您仅向“ charmstyle_com”数据库内的“ charmstyle_com”表授予用户权限。您可能想要的是授予“ charmstyle_com”(或至少“ adminnotification_inbox”表)中所有表的权限 或者