Spring Security相同凭证GET正常POST返回401问题排查
问题原因
Spring Security 默认开启CSRF(跨站请求伪造)防护规则,该规则仅对GET、HEAD、TRACE、OPTIONS四类请求默认放行校验,其余类型请求(包括POST)都要求携带合法的CSRF Token才能通过校验。你直接用curl发起POST请求时没有携带对应的CSRF Token,就会被安全拦截返回401状态码;而GET请求不属于CSRF校验范围,所以可以正常认证通过返回200。
修复方案
针对学习测试的场景,最简便的方式是直接关闭CSRF防护,修改安全配置类的configure方法即可:
@Override protected void configure(HttpSecurity http) throws Exception { http.httpBasic() .and() .csrf().disable() // 新增该行关闭CSRF防护 .authorizeRequests() .anyRequest() .hasRole("ADMIN"); }
如果是正式生产环境存在服务端渲染页面的场景,不建议直接关闭CSRF,此时发起POST请求需要先获取服务端返回的CSRF Token,携带在X-XSRF-TOKEN请求头中发起请求即可。
内容的提问来源于stack exchange,提问作者1174
相关产品推荐
相关产品推荐

