Spring Security 6 功能详解及与老版本差异对比
一、Spring Security 6 核心功能革新
-
现代化配置方式
-
Lambda DSL 配置:摒弃传统链式调用,采用基于Lambda表达式的领域特定语言(DSL)。例如:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**").permitAll() .anyRequest().authenticated() ) .formLogin(withDefaults()); return http.build(); }
这种配置方式更直观,支持类型安全的路径匹配(如
requestMatchers(HttpMethod.POST, "/api/**")
)。 -
组件化配置:移除
WebSecurityConfigurerAdapter
,推荐通过SecurityFilterChain
Bean定义安全规则,实现配置与代码解耦。
-
-
OAuth 2.1 & OpenID Connect 1.0 深度集成
- 授权服务器模块:内置
spring-security-oauth2-authorization-server
模块,支持OAuth 2.1规范,提供令牌生成、验证及刷新令牌功能。 - OpenID Connect 增强:通过
openid
作用域支持用户身份验证和信息获取,简化单点登录(SSO)实现。
- 授权服务器模块:内置
-
无密码认证创新
- 魔法链接登录(Magic Link):用户通过邮件接收包含一次性令牌的链接,点击后完成认证,无需输入密码。
- 一次性令牌(One-Time Token):采用128位随机数生成,支持Redis/数据库存储,有效期5-15分钟,提升安全性。
-
安全上下文与会话管理优化
- 身份验证令牌更新:强化
SecurityContextHolder
管理,支持无状态会话(Stateless)配置。 - 默认安全配置:默认启用CSRF防护、CORS支持及HTTPS强制跳转,减少手动配置。
- 身份验证令牌更新:强化
-
响应式编程支持
- 与Spring WebFlux深度集成,提供
ServerHttpSecurity
配置接口,支持非阻塞I/O下的安全控制。
- 与Spring WebFlux深度集成,提供
二、Spring Security 6 vs 5.x 核心差异
特性维度 | Spring Security 5.x | Spring Security 6.x |
---|---|---|
配置方式 | 继承WebSecurityConfigurerAdapter | 通过SecurityFilterChain Bean组件化配置 |
路径匹配 | antMatchers() (Ant风格通配符) | requestMatchers() (支持正则、HTTP方法) |
OAuth2支持 | 需引入spring-security-oauth2 库 | 内置授权服务器模块,支持OAuth 2.1 |
无密码认证 | 不支持 | 魔法链接、一次性令牌 |
默认安全策略 | 需手动启用CSRF/CORS | 默认启用,并提供更严格的配置 |
JDK要求 | JDK 8+ | JDK 17+(与Spring Boot 3.x兼容) |
过滤器链 | 分散在多个包中 | 统一移动至org.springframework.security.web 包 |
三、升级指南与最佳实践
-
依赖调整
- 升级Spring Boot至3.x版本,确保兼容性:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.4</version> </parent>
- 升级Spring Boot至3.x版本,确保兼容性:
-
配置迁移
- 将
WebSecurityConfigurerAdapter
替换为SecurityFilterChain
:// 5.x 配置 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated(); } } // 6.x 配置 @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()); return http.build(); } }
- 将
-
新功能适配
- 魔法链接登录:
http.oneTimeTokenLogin(oneTime -> oneTime .tokenRepository(new InMemoryOneTimeTokenRepository()) .tokenValidityDuration(Duration.ofMinutes(5)) );
- OAuth2授权服务器:参考官方文档搭建授权服务,配置客户端、作用域及令牌端点。
- 魔法链接登录:
-
安全加固
- 启用HTTPS强制跳转:
http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
- 配置CORS策略:
http.cors(cors -> cors.configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(List.of("https://trusted-domain.com")); return config; }));
- 启用HTTPS强制跳转:
四、总结
Spring Security 6通过配置现代化、协议升级、无密码认证三大核心改进,重新定义了企业级应用安全标准。其组件化配置和Lambda DSL显著提升了开发效率,而OAuth 2.1与OpenID Connect的集成则简化了微服务架构下的身份管理。对于升级用户,需重点关注JDK版本兼容性、配置方式迁移及新功能适配,以充分利用Spring Security 6带来的安全与便捷。