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

无法验证提供的CSRF令牌,因为在Spring Security中找不到您的会话

陈野
2023-03-14

我正在使用Spring Security和java配置

@Override
protected void configure(HttpSecurity http) throws Exception { 
    http
    .authorizeRequests()
    .antMatchers("/api/*").hasRole("ADMIN")
    .and()
    .addFilterAfter(new CsrfTokenResponseHeaderBindingFilter(), CsrfFilter.class)
    .exceptionHandling()
    .authenticationEntryPoint(restAuthenticationEntryPoint)
    .and()
    .formLogin()
    .successHandler(authenticationSuccessHandler)
    .failureHandler(new SimpleUrlAuthenticationFailureHandler());

我正在使用PostMan测试我的REST服务。我成功获取了“csrf令牌”,并且我能够使用请求头中的X-csrf-token登录。但在登录后,当我点击post请求时(我在请求头中包含了用于登录post请求的相同令牌),我会收到以下错误消息:

HTTP状态403-无法验证提供的CSRF令牌,因为找不到您的会话。

谁能告诉我我做错了什么吗。

共有3个答案

宓季同
2023-03-14

禁用CSRF保护是一个坏主意。

Spring将在每个请求后自动生成一个新的CSRF令牌,您需要将其包含在所有具有副作用的HTTP请求中(PUT、POST、PATCH、DELETE)

在Postman中,您可以在每个请求中使用测试将CSRF令牌存储在全局中,例如在使用CookieCsrfTokenRepository

pm.globals.set("xsrf-token", postman.getResponseCookie("XSRF-TOKEN").value);

然后将其作为标题包含在key和value中。

蒋寒
2023-03-14

试试这个:@覆盖受保护的布尔值sameSource禁用(){返回true;}

@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    ...

    // Determines if a CSRF token is required for connecting. This protects against remote
    // sites from connecting to the application and being able to read/write data over the
    // connection. The default is false (the token is required).
    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }
}

来源:WebSocket安全:禁用WebSocket内的CSRF

赵高韵
2023-03-14

根据spring.io:

什么时候应该使用CSRF保护?我们的建议是对普通用户可以通过浏览器处理的任何请求使用CSRF保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用CSRF保护。

所以要禁用它:

@Configuration
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
}

注意:默认情况下,通过Java配置启用CSRF保护

 类似资料:
  • 问题内容: 我在CSRF令牌方面遇到问题。当我提交表单时,正在生成一个新的表单,但是我想我正在生成两个不同的令牌,这有点困惑。还有一个名为的令牌,因此我在开发人员工具中看到了两个不同的cookie(XSRF- TOKEN和_csrf),发布后它们没有变化。 我想要做的是为每个帖子请求生成一个新令牌,并检查它是否有效。我知道为了安全起见应该这样做,但是我坚持了下来。 漫长的一天,我是Express和

  • 问题内容: 在我的rails应用程序中,我在向api的ajax发布中收到“警告:无法验证CSRF令牌的真实性”。 app / views / layouts / application.html.haml : ajax发布 : 问题答案: 假设您已使用Rails 标记设置了CSRF令牌,则请求的令牌将在meta标记中可用: 由于使用的是jQuery,因此可以通过为密钥调用以下值来将令牌传递给AJA

  • 我正在做简单的身份验证(没有ajax或api),并得到一个CSRF真实性令牌的错误。检查下面的POST请求 根url指向,如下所示 Sign_in页面生成的html视图如下所示:

  • 我试图张贴使用ajax在laravel 5.我得到CSRF令牌不匹配异常。我环顾四周,发现可能存在这样的问题,但在这种情况下,我确实包括了所有必要的代码。 请看一下我的代码。 看法 我已经在隐藏输入中提供了令牌,并将其包含在我的帖子中。 我有一个元在头如下。 下面是我的控制器。 这个只是测试用的,这里没什么。我的路线如下 请帮我解决这个问题 这是日志中的输出。 以下是我的浏览器控制台帖子标题和页面

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