Skip to content

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 (/**)
    -> Servlet

2.2 默认 11 个过滤器(按顺序)

顺序过滤器职责
1SecurityContextPersistenceFilter从 Session 恢复 SecurityContext
2LogoutFilter登出处理
3UsernamePasswordAuthenticationFilter表单登录认证
4DefaultLoginPageGeneratingFilter默认登录页面
5BasicAuthenticationFilterHTTP Basic 认证
6RequestCacheAwareFilter请求缓存(登录后跳回)
7SecurityContextHolderAwareRequestFilter包装 HttpServletRequest
8AnonymousAuthenticationFilter匿名用户识别
9SessionManagementFilter会话管理、会话固定保护
10ExceptionTranslationFilter异常转换(401/403)
11FilterSecurityInterceptor访问控制决策

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 索引**

Knowledge4J — Java 知识库