以下是 Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解,结合用户描述的关键点展开说明,并以表格总结:
1. Spring Security 核心原理
Spring Security 通过 Filter 链 实现安全控制,其核心流程如下:
- 启动阶段 :
- 引入
spring-boot-starter-security
后,Spring Boot 自动配置SecurityAutoConfiguration
。 - 通过
@EnableWebSecurity
注解触发安全框架的初始化,创建SecurityFilterChain
Bean(名称为springSecurityFilterChain
)。
- 引入
- Filter 注册 :
DelegatingFilterProxy
拦截所有请求,从 Spring 容器中获取springSecurityFilterChain
(类型FilterChainProxy
)。FilterChainProxy
管理多个Filter
对象(如UsernamePasswordAuthenticationFilter
、CsrfFilter
等),按顺序执行拦截逻辑。
- 请求处理 :
- 每个请求经过
FilterChainProxy
的doFilter()
方法,依次调用拦截器链中的 Filter,完成认证、授权、CSRF 防护等功能。
- 每个请求经过
2. 关键类与流程详解
(1) Spring Security 启动流程
-
依赖引入:
xml<!-- Maven 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
- 引入后,Spring Boot 自动启用
SecurityAutoConfiguration
。
- 引入后,Spring Boot 自动启用
-
Bean 创建:
@EnableWebSecurity
注解触发WebSecurityConfiguration
,创建SecurityFilterChain
Bean(名称springSecurityFilterChain
)。SecurityFilterChain
实际类型为FilterChainProxy
,包含多个Filter
对象。
-
自动配置日志:
plaintextUsing generated security password: <random-generated-password>
- 默认启用安全配置时,Spring Boot 会生成随机密码(可通过
management.security.enabled=false
禁用)。
- 默认启用安全配置时,Spring Boot 会生成随机密码(可通过
(2) 核心类与协作关系
类名 | 作用 | 关键方法/属性 |
---|---|---|
FilterChainProxy | 核心过滤器链,管理所有安全 Filter 的执行顺序。 | getFilters() :获取 Filter 列表 |
DelegatingFilterProxy | Servlet 容器的适配器,将请求委托给 Spring 容器中的 FilterChainProxy 。 |
initFilterBean() :初始化并获取 Bean |
SecurityFilterChain | 安全过滤器链的抽象接口,由 FilterChainProxy 实现。 |
getFilters() :定义 Filter 顺序 |
WebSecurityConfigurerAdapter | 过时配置类(Spring Boot 2.x),现改用 SecurityFilterChain Bean。 |
已弃用,需改用 @Bean SecurityFilterChain |
UsernamePasswordAuthenticationFilter | 处理表单登录认证的 Filter。 | attemptAuthentication() :验证用户凭证 |
CsrfFilter | 处理 CSRF 令牌生成与验证。 | getToken() :获取 CSRF Token |
(3) FilterChainProxy 的执行流程
- 初始化 :
- 通过
DelegatingFilterProxy
从 Spring 容器获取springSecurityFilterChain
Bean。
- 通过
- 请求拦截 :
- 每个请求到达
DelegatingFilterProxy
后,调用FilterChainProxy
的doFilter()
方法。 FilterChainProxy
遍历filters
列表,按顺序执行每个 Filter 的doFilter()
。
- 每个请求到达
- Filter 顺序 :
- 默认顺序由
SecurityFilterChain
定义(如:ChannelProcessingFilter
→WebAsyncManagerIntegrationFilter
→ ...)。 - 可通过
SecurityFilterChain
自定义 Filter 顺序。
- 默认顺序由
(4) 配置注解对比
注解 | 适用场景 | 功能 |
---|---|---|
@EnableWebSecurity | Web 应用 | 启用安全配置,创建 SecurityFilterChain ,集成 Web 特性(如表单登录)。 |
@EnableGlobalAuthentication | 非 Web 应用(如消息服务) | 仅启用认证功能,不包含 Web 相关 Filter(如 CSRF、表单登录)。 |
@EnableMethodSecurity | 方法级安全控制 | 启用 @PreAuthorize 、@PostFilter 等注解。 |
3. 自定义 Filter 的实现
(1) 创建自定义 Filter
java
@Component
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 自定义逻辑(如 Token 解析)
chain.doFilter(request, response);
}
}
(2) 注册到 FilterChainProxy
java
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
4. Spring Boot 3.x 特殊说明
- 自动配置变化 :
- Spring Boot 3.x 中
WebSecurityConfigurerAdapter
已弃用,需通过@Bean SecurityFilterChain
直接配置。
- Spring Boot 3.x 中
- 日志控制 :
- 随机密码日志可通过
logging.level.org.springframework.security=ERROR
禁用。
- 随机密码日志可通过
5. 总结表格
模块/组件 | 作用 | 关键类/注解 |
---|---|---|
启动与配置 | 初始化安全框架,创建 Filter 链 | @EnableWebSecurity 、SecurityAutoConfiguration 、SecurityFilterChain |
Servlet 适配 | 将 Servlet 请求委托给 Spring 容器中的 Filter 链 | DelegatingFilterProxy |
Filter 链管理 | 管理 Filter 顺序和执行逻辑 | FilterChainProxy 、SecurityFilterChain |
认证与授权 | 用户身份验证、权限控制 | UsernamePasswordAuthenticationFilter 、RoleVoter 、AccessDecisionManager |
扩展与自定义 | 注册自定义 Filter 或修改安全策略 | addFilterBefore() 、addFilterAfter() 、@Bean SecurityFilterChain |
6. 执行流程图(文字描述)
- 请求到达 Web 容器 → DelegatingFilterProxy → 获取 springSecurityFilterChain → FilterChainProxy → 遍历并执行所有 Filter → 最终响应 。
- 每个 Filter(如
CsrfFilter
、SecurityContextPersistenceFilter
)按顺序执行。
- 每个 Filter(如
通过以上流程和组件的协作,Spring Security 实现了从请求拦截到权限控制的完整安全机制。在 Spring Boot 3.x 中,需特别注意配置方式的更新(如弃用 WebSecurityConfigurerAdapter
),以确保与新版本兼容。