使用Spring Security的Basic Auth认证后Postman的POST请求不成功的可能原因
今天在用Postman测试接口,没上Spring Security之前,GET类和POST类的接口都测试的好好!
接着在pom.xml添加的Security依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
并在application.yml中添加的Security配置:
security: user: name: user password: pwd123
通过以上配置使用上Spring Security后,GET类和POST类的接口都报未授权:
这个好理解:因为Security默认启用了Basic Auth授权,接着我就在Postman的Authorization页签中设置Basic Auth授权基本信息:
填好授权信息后,清理Cookie再次请求,GET类请求一切正常:
然而,清理Cookie再次请求,POST类请求却依旧不行:
首先,接口本身肯定是没问题的,因为上Spring Security之前一切都挺好!其次,Spring Security本身肯定也是正常工作的,因为Postman中没有进行授权前GET类的POST类的请求都不行!现在GET类的行了,POST类的却不行~,那么这两类请求肯定有不一样的地方,让Spring Security进行了拦截!
捣鼓了大半天,最后发现是Spring Security会对POST、PUT、PATCH等数据提交类的请求进行CSRF验证(防止跨站请求伪造攻击),Spring Security要求这些请求必须携带CSRFToken,但是目前Postman并不会利用Authorization页签中填上的Basic Auth相关信息生成CSRFToken。你得用自己的登录接口来生成,并将生成的CSRFToken添加到Postman后续的各个测试请求的Headers中(X-CSRFToken)。
既然知道了原因,我们为了测试方便,我就不使用登录接口拿CSRFToken,而是暂时将Spring Security的CSRF验证关掉即可(交付测试和上生产时记得重新打开),添加Web安装配置类继承WebSecurityConfigurerAdapter适配器类,并重写configure(HttpSecurity http)方法即可:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated().and().httpBasic().and().csrf().disable(); } }
重新运行应用,清理Cookie再次请求,POST类请求也可以了: