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

前言

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

锥栗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值