spring.security 禁止 curl post 请求

spring.security forbid curl post request

我用 SSM 框架开发了一个演示网站,并使用 spring.security 进行身份验证。我可以使用 post 请求登录网站并使用 get 请求获取数据。但是,我无法使用 post 请求添加数据。它总是被禁止的。如果禁用 CSRF,则可以。我尝试了以下方法,none 有效。

  1. 将“X-CSRF-TOKEN:CSRF 值”添加到 header。
  2. 将“_csrf:CSRF 值”添加到 header。
  3. 将 _csrf 添加到 post 请求 body。

那么如何使 post 请求在启用 CSRF 的情况下工作?另外,我不确定是否需要使用不同的 post 重新生成 CSRF 令牌。奇怪的是,登录 post 请求有效。

是否需要用不同的posts重新生成CSRF token

不,没有必要。

奇怪的是,登录 post 请求有效

令牌在登录后由spring.security重新生成。

那么如何使 post 请求在启用 CSRF 的情况下工作?

关键是如何获取登录后生成的新的CSRF token。一种可能的解决方案是将 CSRF 令牌保存在 cookie 中。 SecurityConfig 应更改为:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin().permitAll();
    }
}

然后,可以通过awk '/XSRF-TOKEN/{print }' cookie从cookie中获取csrf令牌,并使用X-XSRF-TOKEN请求头发送到服务器。完整脚本改为:

#!/usr/bin/env bash

 host=192.168.44.109:8080
 remote=http://${host}
 login=${remote}/login
 users=${remote}/rest/users/

 csrf(){
     awk '/XSRF-TOKEN/{print }' cookie
 }

 curl ${login} -c cookie 1> /dev/null 2>/dev/null

 echo "before login, csrf=$(csrf)"
 curl ${login} -d "username=root&password=123456&_csrf=$(csrf)" -b cookie -c cookie -L -i
 echo "after login, csrf=$(csrf)"

 name=$(date '+%Y%m%d-%H:%M:%S')
 curl ${users} -H "X-XSRF-TOKEN: $(csrf)" -H 'Content-Type: application/json' -d "{\"name\": \"${name}\"}" -b cookie -L -v

 rm -f cookie