已设置authorizeHttpRequests为permitAll,为何仅POST请求返回403?
解决Spring Security下POST请求403 Forbidden问题
问题原因
你的Spring Security配置虽然放开了所有请求的权限,但Spring Security默认启用了CSRF(跨站请求伪造)防护机制。对于POST、PUT、DELETE这类非安全HTTP方法,框架会要求请求携带有效的CSRF令牌,否则直接返回403禁止访问。而GET请求属于安全方法,默认不会触发CSRF验证,因此可以正常访问。
解决方案
方案一:临时关闭CSRF防护(测试环境适用)
修改ApplicationConfig配置类,在安全过滤链中添加csrf().disable()来关闭CSRF防护:
@Configuration @EnableWebSecurity public class ApplicationConfig{ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() // 关闭CSRF防护 .authorizeHttpRequests((authz)-> authz.anyRequest().permitAll()); return http.build(); } }
修改后重启服务,再用以下命令测试POST请求(注意指定内容类型,匹配@RequestBody的解析要求):
curl -X POST http://localhost:8080/kafka -d "Hello World" -H "Content-Type: text/plain"
方案二:携带CSRF令牌(生产环境推荐)
生产环境不建议关闭CSRF防护,需要在请求中正确携带CSRF令牌:
- 先通过GET请求获取CSRF令牌,Spring Security会在响应Cookie中设置
XSRF-TOKEN:
curl -c cookie.txt http://localhost:8080/kafka
- 从Cookie文件中提取令牌,再携带令牌发送POST请求:
TOKEN=$(grep XSRF-TOKEN cookie.txt | awk '{print $7}') curl -X POST http://localhost:8080/kafka -d "Hello World" -H "Content-Type: text/plain" -b cookie.txt -H "X-XSRF-TOKEN: $TOKEN"
内容的提问来源于stack exchange,提问作者JGleason
相关产品推荐
相关产品推荐

