07.1 — 认证流程与过滤器链
定位: Spring Security 的过滤器链结构和完整认证流程 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: 过滤器链结构、认证流程、核心接口关系
一、这是什么?为什么需要它?
Spring Security 基于 Servlet Filter 构建。所有 HTTP 请求通过过滤器链,链中的每个过滤器负责一项安全职责(认证、会话管理、CSRF 等)。
二、原理拆解
2.1 DelegatingFilterProxy 与 FilterChainProxy
HTTP 请求 -> DelegatingFilterProxy (Servlet <-> Spring 桥梁)
-> FilterChainProxy (Spring 管理)
-> SecurityFilterChain #1 (/api/**)
-> SecurityFilterChain #2 (/admin/**)
-> SecurityFilterChain #3 (/**)
-> Servlet2.2 默认 11 个过滤器(按顺序)
| 顺序 | 过滤器 | 职责 |
|---|---|---|
| 1 | SecurityContextPersistenceFilter | 从 Session 恢复 SecurityContext |
| 2 | LogoutFilter | 登出处理 |
| 3 | UsernamePasswordAuthenticationFilter | 表单登录认证 |
| 4 | DefaultLoginPageGeneratingFilter | 默认登录页面 |
| 5 | BasicAuthenticationFilter | HTTP Basic 认证 |
| 6 | RequestCacheAwareFilter | 请求缓存(登录后跳回) |
| 7 | SecurityContextHolderAwareRequestFilter | 包装 HttpServletRequest |
| 8 | AnonymousAuthenticationFilter | 匿名用户识别 |
| 9 | SessionManagementFilter | 会话管理、会话固定保护 |
| 10 | ExceptionTranslationFilter | 异常转换(401/403) |
| 11 | FilterSecurityInterceptor | 访问控制决策 |
2.3 认证流程
POST /login (username + password)
-> UsernamePasswordAuthenticationFilter
-> 创建 UsernamePasswordAuthenticationToken
-> AuthenticationManager.authenticate(token)
-> ProviderManager (委托给实现的 Provider)
-> AuthenticationProvider
-> UserDetailsService.loadUserByUsername(username)
-> PasswordEncoder.matches(rawPassword, encodedPassword)
-> 返回认证成功的 Authentication
-> SecurityContextHolder.setAuthentication(auth)
-> 登录成功2.4 核心接口
| 接口 | 职责 | 默认实现 |
|---|---|---|
| AuthenticationManager | 认证入口 | ProviderManager |
| AuthenticationProvider | 具体认证逻辑 | DaoAuthenticationProvider |
| UserDetailsService | 加载用户信息 | 需自定义 |
| PasswordEncoder | 密码编码/校验 | BCryptPasswordEncoder |
| SecurityContextHolder | 存储当前认证信息 | ThreadLocal 模式 |
2.5 密码编码器对比
| 实现 | 强度 | 推荐 |
|---|---|---|
| BCryptPasswordEncoder | 高 | ✅ 推荐 |
| Argon2PasswordEncoder | 极高 | ✅ 高安全 |
| SCryptPasswordEncoder | 高 | ⭐ |
| NoOpPasswordEncoder | 无 | ❌ 禁用 |
三、面试视角
| 追问 | 答案要点 |
|---|---|
| DelegatingFilterProxy 的作用? | Servlet 容器和 Spring IoC 之间的桥梁 |
| 如何在过滤器链中添加自定义过滤器? | 实现 OncePerRequestFilter,通过 HttpSecurity.addFilterBefore/After 注册 |
| AuthenticationManager 和 Provider 的关系? | Manager 是入口,委托给多个 Provider 进行实际认证 |
📚 相关链接
- **JWT与OAuth2** — 自定义过滤器集成 JWT
- **方法安全与CSRF** — 方法级安全控制
- ← 返回 **返回 Spring Security 索引**