SpringSecurity过滤器链全解析
SpringSecurity过滤器链全解析
过滤器链(Security Filter Chain)
Spring Security 的工作原理是通过一组过滤器(Filter)来拦截和处理请求,这些过滤器形成了一个过滤器链。
Spring Security 通过一系列过滤器组成的过滤器链来实现安全控制。这些过滤器按照特定顺序执行,每个过滤器都有其特定的职责。过滤器链的顺序是固定的,不能随意改变。
关键过滤器及其职责:
Spring Security 的过滤器链由多个过滤器组成,每个过滤器承担特定的职责。以下是部分关键过滤器的介绍:
• UsernamePasswordAuthenticationFilter:专门处理用户的用户名和密码认证请求。
• SecurityContextPersistenceFilter:负责维护用户的安全上下文信息,在每个请求开始时加载上下文,在请求完成时存储上下文。
• CsrfFilter:用于防止跨站请求伪造攻击(CSRF),通过生成和验证 CSRF Token 来保护应用安全。
• ExceptionTranslationFilter:捕获过滤器链中的异常,并将其转换为用户友好的响应。
完整过滤器链列表(按执行顺序)
1. SecurityContextPersistenceFilter
职责:负责维护用户的安全上下文信息,在每个请求开始时加载上下文,在请求完成时存储上下文。
功能:在请求开始时从HttpSession中恢复SecurityContext,请求结束时保存SecurityContext
位置:过滤器链的第一个(不需要显式配置SecurityContextPersistenceFilter)
详细说明:
- 这是过滤器链中最重要的过滤器之一
- 负责在每个HTTP请求开始时从HttpSession中加载SecurityContext
- SecurityContext包含当前认证用户的信息(Authentication对象)
- 请求处理完成后,将更新后的SecurityContext保存回HttpSession
- 使用ThreadLocal存储SecurityContext,确保线程安全
- 支持多种存储策略:HttpSession、Redis、数据库等
2. WebAsyncManagerIntegrationFilter
职责:集成SecurityContext到Spring的异步处理
功能:确保异步请求处理时SecurityContext能够正确传递
详细说明:
- 处理Spring MVC的异步请求处理场景
- 当使用@Async注解或DeferredResult时,确保SecurityContext能正确传递到异步线程
- 在异步处理开始前保存SecurityContext
- 在异步处理完成后恢复SecurityContext
- 防止异步处理中出现SecurityContext丢失的问题
3. HeaderWriterFilter
职责:添加安全相关的HTTP响应头
功能:添加如X-Content-Type-Options、X-XSS-Protection、X-Frame-Options等安全头
详细说明:
- X-Content-Type-Options: nosniff:防止MIME类型嗅探攻击
- X-XSS-Protection: 1; mode=block:启用浏览器的XSS过滤器
- X-Frame-Options: DENY:防止页面被嵌入到iframe中,预防点击劫持
- Strict-Transport-Security:强制使用HTTPS连接
- Content-Security-Policy:定义内容安全策略
- Referrer-Policy:控制Referer头的发送策略
- 这些头部信息在响应返回给客户端之前被添加
4. CorsFilter
职责:处理跨域请求
功能:根据CORS配置处理跨域资源共享请求
详细说明:
- 处理浏览器的CORS预检请求(OPTIONS)
- 验证跨域请求的来源(Origin)是否被允许
- 添加适当的CORS响应头:Access-Control-Allow-Origin、Access-Control-Allow-Methods等
- 支持复杂请求和简单请求的处理
- 可以配置允许的域名、HTTP方法、请求头等
- 在微服务架构中特别重要,用于处理前后端分离的跨域问题
5. CsrfFilter
职责:防止CSRF攻击
功能:生成和验证CSRF Token,保护状态改变的请求
详细说明:
- CSRF攻击原理:利用用户已登录的身份,诱导用户在不知情的情况下执行恶意操作
- 防护机制:为每个会话生成唯一的CSRF Token
- Token验证:对于状态改变的请求(POST、PUT、DELETE),验证CSRF Token
- Token存储:可以存储在HttpSession、Cookie或自定义存储中
- 白名单机制:可以配置某些URL跳过CSRF检查(如API接口)
- Token传递方式:可通过表单隐藏字段、请求头或请求参数传递
6. LogoutFilter
职责:处理用户登出请求
功能:清除认证信息、会话失效、重定向到登出成功页面
详细说明:
- 匹配登出URL:检查请求是否匹配配置的登出URL
- 会话无效化:调用HttpSession.invalidate()销毁会话
- 清除认证信息:从SecurityContext中移除Authentication对象
- 清除Cookie:删除Remember-Me、JSESSIONID等相关Cookie
- 清除缓存:清除可能存在的用户缓存信息
- 重定向处理:根据配置重定向到登出成功页面或返回JSON响应
- 登出处理器链:支持多个LogoutHandler的链式处理
7. OAuth2AuthorizationRequestRedirectFilter
职责:处理OAuth2授权请求重定向
功能:将用户重定向到OAuth2授权服务器
详细说明:
- 授权码流程启动:当用户访问需要OAuth2认证的资源时启动
- 构建授权URL:构造包含client_id、redirect_uri、scope等参数的授权URL
- 状态参数生成:生成state参数防止CSRF攻击
- 重定向执行:将用户重定向到OAuth2授权服务器
- 多提供商支持:支持同时配置多个OAuth2提供商(Google、GitHub等)
- 授权请求缓存:将授权请求信息暂存,供回调时使用
8. Saml2WebSsoAuthenticationRequestFilter
职责:处理SAML2认证请求
功能:生成SAML2认证请求并重定向
详细说明:
- SAML2协议支持:支持Security Assertion Markup Language 2.0协议
- 认证请求生成:生成SAML AuthnRequest XML文档
- 签名处理:对认证请求进行数字签名(如果配置)
- 重定向绑定:支持HTTP重定向绑定传输认证请求
- POST绑定:支持HTTP POST绑定传输认证请求
- 身份提供商集成:与企业身份提供商(如AD FS)集成
- 元数据处理:处理SAML元数据配置
9. X509AuthenticationFilter
职责:处理X.509证书认证
功能:从SSL/TLS连接中提取客户端证书进行认证
详细说明:
- 双向SSL认证:支持客户端证书认证(mTLS)
- 证书提取:从HttpServletRequest中提取客户端证书
- 证书验证:验证证书的有效性、吊销状态等
- 用户身份提取:从证书的Subject或SubjectAlternativeName中提取用户身份
- 证书链验证:验证完整的证书链到受信任的根CA
- 企业PKI集成:与企业公钥基础设施(PKI)系统集成
- 智能卡支持:支持智能卡等硬件token中的证书
10. AbstractPreAuthenticatedProcessingFilter
职责:处理预认证场景
功能:处理由外部系统已经认证的用户信息
详细说明:
- 预认证概念:用户已经通过外部系统(如SiteMinder、WebSEAL)认证
- 用户信息提取:从HTTP头、环境变量或其他位置提取用户身份
- 信任关系:基于与外部认证系统的信任关系
- 角色映射:将外部系统的角色映射到Spring Security的权限
- 会话管理:管理预认证用户的会话状态
- 集成场景:常用于企业级应用的单点登录集成
11. CasAuthenticationFilter
职责:处理CAS认证
功能:处理从CAS服务器返回的认证信息
详细说明:
- CAS协议:Central Authentication Service协议实现
- Service Ticket验证:验证从CAS服务器返回的Service Ticket
- 票据交换:将Service Ticket交换为用户认证信息
- 单点登录:实现跨多个应用的单点登录
- 单点登出:支持单点登出(Single Logout)功能
- 代理票据:支持代理票据(Proxy Ticket)用于后端服务调用
- 属性获取:从CAS服务器获取用户属性信息
12. OAuth2LoginAuthenticationFilter
职责:处理OAuth2登录认证
功能:处理OAuth2授权码流程的回调
详细说明:
- 授权码处理:处理授权服务器返回的授权码
- Token交换:使用授权码交换访问令牌(Access Token)
- 用户信息获取:使用访问令牌获取用户信息
- 身份验证:基于获取的用户信息创建Authentication对象
- 错误处理:处理OAuth2流程中的各种错误情况
- 多提供商支持:支持Google、Facebook、GitHub等多个OAuth2提供商
- 令牌刷新:支持刷新令牌(Refresh Token)的自动刷新
13. Saml2WebSsoAuthenticationFilter
职责:处理SAML2 SSO认证
功能:处理SAML2断言响应
详细说明:
- 断言处理:处理身份提供商返回的SAML断言(Assertion)
- 签名验证:验证SAML响应和断言的数字签名
- 时间戳验证:验证断言的有效时间窗口
- 受众限制:验证断言的受众(Audience)限制
- 属性提取:从SAML断言中提取用户属性
- 会话索引:处理SAML会话索引用于单点登出
- 加密支持:支持加密的SAML断言解密
14. UsernamePasswordAuthenticationFilter
职责:处理用户名密码认证
功能:处理表单登录,验证用户名和密码
详细说明:
- 表单数据提取:从HTTP POST请求中提取用户名和密码
- 认证令牌创建:创建UsernamePasswordAuthenticationToken
- 认证管理器调用:将认证令牌传递给AuthenticationManager
- 认证成功处理:认证成功后的重定向或响应处理
- 认证失败处理:认证失败后的错误页面或错误响应
- Remember Me集成:与Remember Me功能集成
- 会话管理:创建新会话或迁移现有会话
15. OpenIDAuthenticationFilter
职责:处理OpenID认证(已废弃)
功能:处理OpenID 1.0/2.0认证协议
详细说明:
- 已废弃功能:OpenID 1.0/2.0协议已被OAuth2/OpenID Connect取代
- 历史兼容性:为了向后兼容性保留
- 不推荐使用:新项目应使用OAuth2LoginAuthenticationFilter
- 迁移建议:建议迁移到现代的OAuth2/OIDC实现
16. DefaultLoginPageGeneratingFilter
职责:生成默认登录页面
功能:当没有自定义登录页面时,生成Spring Security默认登录页面
详细说明:
- 动态页面生成:动态生成HTML登录表单
- 样式集成:包含基本的CSS样式
- 错误信息显示:显示登录错误信息
- Remember Me选项:包含"记住我"复选框
- 多认证方式:支持显示多种认证方式的链接
- 开发环境便利:主要用于开发和测试环境
- 生产环境替换:生产环境建议使用自定义登录页面
17. DefaultLogoutPageGeneratingFilter
职责:生成默认登出页面
功能:生成默认的登出确认页面
详细说明:
- 确认页面:生成登出确认的HTML页面
- CSRF Token:自动包含CSRF Token
- POST表单:生成POST方式的登出表单
- 简单样式:包含基本的页面样式
- 开发便利:简化开发阶段的配置
- 自定义替换:生产环境通常需要自定义登出页面
18. ConcurrentSessionFilter
职责:管理并发会话
功能:检测会话是否过期,限制用户并发登录数量
详细说明:
- 并发控制:限制同一用户的最大并发会话数
- 会话过期检测:检测会话是否被标记为过期
- 过期处理策略:
- 阻止新登录:达到最大会话数时阻止新登录
- 踢出旧会话:新登录时踢出最旧的会话
- 会话注册表:维护活跃会话的注册表
- 过期响应:为过期会话返回适当的响应
- 集群支持:支持集群环境下的会话管理
19. DigestAuthenticationFilter
职责:处理HTTP摘要认证
功能:处理HTTP Digest认证协议
详细说明:
- Digest协议:实现RFC 2617定义的HTTP摘要认证
- 摘要计算:使用MD5算法计算认证摘要
- 防重放攻击:通过nonce值防止重放攻击
- 质量保护:支持qop(quality of protection)参数
- 无明文传输:密码不以明文形式传输
- 兼容性:与标准HTTP客户端兼容
- 安全性考虑:MD5已不够安全,现代应用较少使用
20. BearerTokenAuthenticationFilter
职责:处理Bearer Token认证
功能:从请求中提取Bearer Token进行认证
详细说明:
- JWT Token支持:主要用于JWT(JSON Web Token)认证
- Token提取:从Authorization头中提取Bearer Token
- Token验证:验证Token的签名、过期时间等
- 用户信息解析:从Token中解析用户身份和权限信息
- 无状态认证:支持无状态的API认证
- 微服务架构:特别适用于微服务架构的API认证
- OAuth2集成:与OAuth2 Resource Server集成
21. BasicAuthenticationFilter
职责:处理HTTP基础认证
功能:处理HTTP Basic认证协议
详细说明:
- Basic协议:实现RFC 7617定义的HTTP基础认证
- Base64编码:用户名密码使用Base64编码传输
- 认证头处理:解析Authorization: Basic头
- 简单实现:实现简单,广泛支持
- 安全风险:密码以Base64编码传输,需HTTPS保护
- API认证:常用于RESTful API的简单认证
- 向后兼容:与旧系统和客户端兼容性好
22. RequestCacheAwareFilter
职责:处理请求缓存
功能:在认证成功后重定向到原始请求的URL
详细说明:
- 请求缓存机制:缓存用户认证前尝试访问的请求
- 认证后重定向:认证成功后自动重定向到原始请求
- 请求匹配:根据缓存的请求信息进行匹配
- 用户体验优化:避免用户重复输入或导航
- HTTP方法保持:保持原始请求的HTTP方法
- 请求参数保持:保持原始请求的参数信息
- 缓存策略:支持不同的请求缓存策略
23. SecurityContextHolderAwareRequestFilter
职责:包装HttpServletRequest
功能:提供与Spring Security集成的request方法
详细说明:
- 请求包装:将HttpServletRequest包装为SecurityContextHolderAwareRequestWrapper
- 安全方法集成:提供getUserPrincipal()、isUserInRole()等安全相关方法
- 角色检查:实现基于Spring Security角色的isUserInRole()方法
- 用户主体获取:通过getUserPrincipal()获取当前认证用户
- Servlet API集成:将Spring Security与标准Servlet API无缝集成
- 向后兼容:保持与标准Servlet API的兼容性
24. JaasApiIntegrationFilter
职责:JAAS API集成
功能:将SecurityContext与JAAS Subject集成
详细说明:
- JAAS集成:与Java Authentication and Authorization Service集成
- Subject绑定:将Spring Security的Authentication绑定到JAAS Subject
- 权限映射:将Spring Security权限映射为JAAS Principal
- 企业集成:便于与企业JAAS环境集成
- 遗留系统支持:支持需要JAAS的遗留系统
- 线程上下文:在当前线程上下文中设置JAAS Subject
25. RememberMeAuthenticationFilter
职责:处理"记住我"功能
功能:自动登录已选择"记住我"的用户
详细说明:
- Cookie检查:检查Remember Me Cookie的存在和有效性
- Token验证:验证Remember Me Token的合法性
- 自动认证:为有效的Remember Me用户创建认证对象
- 安全策略:
- 基于Hash的Token:简单但不太安全
- 基于数据库的持久Token:更安全的实现
- Token轮换:每次使用后更新Token,防止Token被盗用
- 过期管理:管理Remember Me Token的过期时间
26. AnonymousAuthenticationFilter
职责:处理匿名认证
功能:为未认证用户创建匿名认证对象
详细说明:
- 匿名用户创建:为未认证用户创建匿名Authentication对象
- 默认角色分配:分配默认的匿名角色(如ROLE_ANONYMOUS)
- 统一处理模型:确保SecurityContext中始终有Authentication对象
- 权限控制简化:简化权限控制逻辑,避免null检查
- 匿名访问支持:支持对匿名用户的访问控制
- 配置灵活性:可以自定义匿名用户的身份和权限
27. OAuth2AuthorizationCodeGrantFilter
职责:处理OAuth2授权码授权
功能:处理OAuth2客户端的授权码流程
详细说明:
- 授权码流程:实现OAuth2授权码授权类型
- 客户端认证:作为OAuth2客户端向授权服务器认证
- Token获取:使用授权码获取访问令牌
- 资源访问:使用访问令牌访问受保护资源
- 令牌管理:管理访问令牌和刷新令牌
- 错误处理:处理OAuth2流程中的错误响应
28. SessionManagementFilter
职责:管理会话
功能:会话固定保护、并发会话控制、会话创建策略
详细说明:
- 会话固定保护:防止会话固定攻击
- none:不做任何处理
- newSession:创建新会话
- migrateSession:迁移会话数据到新会话
- changeSessionId:仅改变会话ID
- 会话创建策略:
- always:总是创建会话
- never:从不创建会话
- if_required:需要时创建
- stateless:无状态,不创建会话
- 并发控制:控制同一用户的并发会话数量
- 无效会话处理:处理无效或过期的会话
- 会话超时管理:管理会话的超时策略
29. ExceptionTranslationFilter
职责:异常转换处理
功能:捕获安全异常并转换为适当的HTTP响应
详细说明:
- 异常捕获:捕获后续过滤器抛出的安全相关异常
- 认证异常处理:
- AuthenticationException:未认证异常
- 启动认证流程或返回401状态码
- 授权异常处理:
- AccessDeniedException:访问拒绝异常
- 返回403状态码或重定向到错误页面
- 请求缓存:在重定向到认证页面前缓存原始请求
- 认证入口点:调用配置的AuthenticationEntryPoint
- 访问拒绝处理器:调用配置的AccessDeniedHandler
30. FilterSecurityInterceptor
职责:访问控制决策
功能:基于配置的安全元数据进行授权决策,这是过滤器链的最后一个过滤器
详细说明:
- 最后防线:过滤器链中的最后一道安全检查
- 访问决策:基于配置的URL模式和用户权限进行访问决策
- 安全元数据源:使用SecurityMetadataSource获取资源的安全配置
- 访问决策管理器:使用AccessDecisionManager进行最终的访问决策
- 投票机制:支持多个AccessDecisionVoter的投票机制
- 角色层次:支持角色层次结构的权限检查
- 方法级安全:配合@Secured、@PreAuthorize等注解实现方法级安全9. X509AuthenticationFilte
- 职责:处理X.509证书认证
- 功能:从SSL/TLS连接中提取客户端证书进行认证