使用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类请求也可以了:

原文地址:https://www.cnblogs.com/xuruiming/p/13296312.html