Spring Security 的整体架构设计为模块化、可扩展的安全框架,其核心围绕 过滤器链 和 安全上下文 展开,支持多样化的认证与授权机制。以下是其架构的核心组件及协作流程:
1. 核心架构图
HTTP 请求 → [Security Filter Chain] → 资源访问
↑ ↓
认证(Authentication) ←→ 授权(Authorization)
↑ ↓
用户凭证(Credentials) → 安全上下文(SecurityContext)
2. 核心组件与职责
(1) 过滤器链(Security Filter Chain)
• 作用:拦截所有 HTTP 请求,按顺序执行安全逻辑。
• 关键过滤器:
• SecurityContextPersistenceFilter
:从存储(如 Session)加载或创建安全上下文。
• UsernamePasswordAuthenticationFilter
:处理表单登录请求。
• OAuth2LoginAuthenticationFilter
:处理 OAuth2 第三方登录。
• AnonymousAuthenticationFilter
:为未认证用户赋予匿名身份。
• ExceptionTranslationFilter
:处理认证/授权异常(如跳转登录页或返回 403)。
• FilterSecurityInterceptor
:执行最终访问控制决策(授权)。
(2) 认证体系(Authentication)
• AuthenticationManager
:认证入口,委托给具体的 AuthenticationProvider
。
• AuthenticationProvider
:实现特定认证逻辑(如数据库、LDAP、OAuth2)。
public interface AuthenticationProvider {
Authentication authenticate(Authentication auth) throws AuthenticationException;
boolean supports(Class<?> authentication);
}
• UserDetailsService
:加载用户数据(如从数据库查询用户)。
(3) 授权体系(Authorization)
• AccessDecisionManager
:协调投票器(Voter)决定是否允许访问资源。
• AccessDecisionVoter
:根据权限规则投票(如基于角色、IP、时间)。
• 安全表达式:通过 @PreAuthorize("hasRole('ADMIN')")
定义方法级权限。
(4) 安全上下文(SecurityContext)
• SecurityContextHolder
:存储当前用户的认证信息(Authentication
对象)。
• 默认使用 ThreadLocal
保存上下文,支持跨请求的线程安全。
(5) 配置体系(Configuration)
• HttpSecurity
:配置 URL 级别的访问规则、认证方式、CSRF 等。
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.formLogin(Customizer.withDefaults());
• WebSecurity
:配置全局安全行为(如忽略静态资源)。
3. 核心流程
(1) 认证流程
- 用户提交凭证(如用户名密码、OAuth2 Token)。
- 过滤器拦截请求,提取凭证并创建
Authentication
对象。 AuthenticationManager
调用匹配的AuthenticationProvider
进行认证。- 认证成功后,将
Authentication
对象存入SecurityContextHolder
。
(2) 授权流程
- 用户访问受保护资源(如
/admin
)。 FilterSecurityInterceptor
调用AccessDecisionManager
。AccessDecisionManager
收集所有AccessDecisionVoter
的投票结果。- 根据投票结果决定是否放行(如所有 Voter 通过则授权成功)。
4. 模块化设计
Spring Security 按功能拆分为独立模块,按需引入:
模块 | 功能 |
---|---|
spring-security-core | 基础认证、授权、加密工具 |
spring-security-web | Web 安全(过滤器链、CSRF 防护) |
spring-security-oauth2 | OAuth2 客户端与资源服务器支持 |
spring-security-ldap | LDAP/AD 集成 |
spring-security-test | 单元测试支持(模拟用户、CSRF 禁用) |
5. 扩展性设计
• 自定义认证:实现 AuthenticationProvider
支持新认证方式(如短信验证码)。
• 自定义权限规则:实现 AccessDecisionVoter
或使用 SpEL 表达式。
• 动态权限管理:结合数据库动态加载 URL 权限规则。
6. 与 Spring 生态集成
• 依赖注入:通过 @Autowired
注入安全组件(如 UserDetailsService
)。
• AOP 支持:通过 @PreAuthorize
实现方法级安全控制。
• Spring Boot 自动配置:自动配置默认安全规则(如生成默认登录页)。
总结
Spring Security 的架构通过 过滤器链 和 分层组件 实现灵活的安全控制,核心特点包括:
• 模块化:按需选择功能模块(如 OAuth2、LDAP)。
• 可扩展:支持自定义认证、授权逻辑。
• 无缝集成:与 Spring 生态深度整合,简化配置。
通过理解其架构,可快速定位安全问题(如过滤器顺序、权限配置错误),并高效实现复杂安全需求。