【Spring Security】Postman调用时无授权与CSRF验证

本文介绍了SpringSecurity的基本特性和配置,包括认证、授权、过滤器链、异常处理等功能。在配置SpringSecurity后,当使用Postman调用接口遇到401无授权错误时,可以通过禁用CSRF保护并设置BasicAuth认证信息解决。配置示例展示了如何允许特定路径的匿名访问,并启用基于表单的身份验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Spring Security 是一个强大的、高度可定制的 Java 安全框架,它为基于 Spring 的应用程序提供了全面的安全服务和解决方案。Spring Security 主要特性:

  1. 认证(Authentication):
    认证是验证用户身份的过程。Spring Security 提供了多种认证方式,如用户名/密码、HTTP 基本认证、OAuth、JWT 等。
    用户提交的凭证(如用户名和密码)会被转换成 Authentication 对象,然后通过 AuthenticationManager 进行处理。
  2. 授权(Authorization):
    授权是确定已认证用户可以访问哪些资源或执行哪些操作的过程。Spring Security 支持基于角色的访问控制(RBAC)和访问控制列表(ACL)等授权模型。
    可以通过配置 WebSecurity 或使用注解(如 @PreAuthorize、@PostAuthorize 等)来定义访问规则。
  3. 安全对象封装:
    Spring Security 使用 SecurityContextHolder 类来存储当前的 Authentication 信息和相关的安全上下文。
  4. 过滤器链(Filter Chain):
    Spring Security 实现了一个灵活的过滤器链机制,用于处理所有的 HTTP 请求。
    过滤器链中的每个过滤器负责处理特定的安全任务,如身份验证、会话管理、访问决策等。
  5. 异常处理:
    Spring Security 提供了 ExceptionTranslationFilter,用于捕获并处理与安全相关的异常,如 AccessDeniedException、AuthenticationException 等。
  6. 登录和登出功能:
    Spring Security 提供了开箱即用的登录和登出功能,包括表单登录、HTTP 基本认证登录、 remember-me 功能等。
  7. 会话管理和状态管理:
    Spring Security 支持对用户会话的管理,包括会话固定、会话超时、并发会话控制等功能。
    同时也支持无状态的 RESTful 应用程序的安全性,例如通过 JWT 进行状态管理。
  8. 加密和密码存储:
    Spring Security 提供了对密码的加密和存储支持,包括 BCrypt、SHA-256、PBKDF2 等多种加密算法。
    Spring Security 自动提供了 CSRF 防护功能,可以通过配置启用或禁用。
  9. 集成其他安全技术:
    Spring Security 可以轻松地与其他安全技术和框架集成,如 LDAP、JAAS、OAuth、SAML 等。
  10. 自定义扩展:
    Spring Security 设计得非常灵活,允许开发者根据自己的需求进行深度定制和扩展。

问题

配置了Spring Security时,Postman调用相关接口,报401显示无授权,返回体要么是登录页:

在这里插入图片描述

要么只返回一个

1

实现

相关依赖


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

实现

Security默认启用了Basic Auth授权,应该在Postman的Authorization页签中设置Basic Auth授权基本信息,设置用户名和密码:
在这里插入图片描述

由于Postman无法用Authorization页签中填上的Basic Auth相关信息生成 CSRF Token,因此需要将CSRF 验证关掉:

设定配置如下:
WebSecurityConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/swagger-ui.html").permitAll()
            .antMatchers("/webjars/**").permitAll()
            .antMatchers("/swagger-resources/**").permitAll()
            .antMatchers("/v2/*").permitAll()
            .antMatchers("/csrf").permitAll()
            .antMatchers("/").permitAll()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .csrf().disable()
            .formLogin()
        ;
    }
}

Spring Security配置类:

@EnableWebSecurity :启用Spring Security的Web安全功能。这个注解会启动一个默认的安全配置,并允许通过扩展WebSecurityConfigurerAdapter来自定义安全配置。
继承 WebSecurityConfigurerAdapter 类:抽象类提供了默认的安全配置。通过继承这个类并覆盖其方法,可以自定义安全配置。
configure(HttpSecurity http) 方法:用于配置HTTP安全规则:
.authorizeRequests():开始配置授权规则。
.antMatchers("/swagger-ui.html").permitAll():允许所有用户访问 /swagger-ui.html 路径。
.antMatchers("/webjars/**").permitAll():允许所有用户访问 /webjars/ 开头的路径。
.antMatchers("/swagger-resources/**").permitAll().antMatchers("/v2/*").permitAll():允许所有用户访问 Swagger 相关资源。
.antMatchers("/csrf").permitAll():允许所有用户访问 CSRF 相关路径。
.antMatchers("/").permitAll() .antMatchers("/login").permitAll():允许所有用户访问主页和登录页面。
.anyRequest().authenticated():对于其他所有请求,要求用户必须经过身份验证才能访问。
.and():链式调用,用于连接多个配置项。
.csrf().disable():禁用跨站请求伪造(CSRF)防护。
.formLogin():启用基于表单的身份验证机制。这将自动配置一个登录表单和处理登录请求的逻辑。

配置了一个基本的Spring Security安全框架,允许所有用户访问Swagger文档、主页、登录页面和其他一些特定路径,而对于其他所有请求,则要求用户必须经过身份验证。同时,禁用了CSRF防护,并启用了基于表单的身份验证机制。

运行

重新启动服务

调用登录接口尝试登录
在这里插入图片描述
调用自己的接口

在这里插入图片描述

成功调用

参考

https://www.cnblogs.com/xuruiming/p/13296312.html

### Postman 默认 Headers 配置 在 Postman 中,默认情况下发送请求不会自动附加任何头部信息。但是,可以通过设置全局或集合级别的默认头信息来简化开发流程[^1]。 #### 设置全局默认Headers 为了给所有请求应用相同的Header配置,在Postman界面左侧点击个人资料图标旁边的齿轮按钮进入Settings页面。在这里选择`General`选项卡下的`Send Postman Token header`开关可以控制是否向每个发出的HTTP请求中加入唯一的Postman令牌作为身份验证的一部分。不过这并不是传统意义上的自定义header项。 对于真正的自定义全局headers,则需利用环境变量或者全局变量功能。通过编辑Environment Variables(环境变量)或Global Variables(全局变量),可以在其中定义键值对形式的数据用于存储常用的header字段及其取值。之后便可在任意地方使用`${variableName}`语法调用这些预设好的值而无需重复输入。 #### 在Collection级别设定Default Headers 更推荐的做法是在创建API文档集(collection)之初就为其指定一组固定的headers。具体操作如下: - 打开目标collection详情页; - 切换到`Pre-request Script`标签页编写脚本逻辑读取并赋初值给特定变量; - 或者直接前往该collection settings里找到`Authorization`, `Proxy`, 和最重要的`Headers`部分进行集中管理; 这样做的好处在于能够确保同一项目内的多个API端点共享一致性的访问认证机制和其他必要的传输层属性而不必每次都手动调整。 ```javascript // Pre-request script example to set a default Authorization token as an environment variable. pm.environment.set("authToken", "your_token_here"); ``` 当涉及到具体的接口测试场景下,比如数据库交互前建立连接(JDBC)[^4], 提交表单携带CSRF tokens, 或是从响应体解析JSON对象获取签名(sign)等动作[^2],合理运用上述提到的各种方式可以帮助提高工作效率减少错误发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锥栗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值