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