SpringSecurity 配置项
总的类图
把 Spring Security 的核心领域模型设计整理如下:

核心架构
权限系统一般包含两大核心模块:认证(Authentication)和鉴权(Authorization)。
- 认证:认证模块负责验证用户身份的合法性,生成认证令牌,并保存到服务端会话中(如TLS)。
- 鉴权:鉴权模块负责从服务端会话内获取用户身份信息,与访问的资源进行权限比对。
官方给出的 Spring Security 的核心架构图如下:

核心架构解读:
- AuthenticationManager:负责认证管理,解析用户登录信息(封装在 Authentication),读取用户、角色、权限信息进行认证,认证结果被回填到 Authentication,保存在 SecurityContext。
- AccessDecisionManager:负责鉴权投票表决,汇总投票器的结果,实现一票通过(默认)、多票通过、一票否决策略。
- SecurityInterceptor:负责权限拦截,包括 Web URL 拦截和方法调用拦截。通过 ConfigAttributes 获取资源的描述信息,借助于 AccessDecisionManager 进行鉴权拦截。(就是将请求委托给各个具体的鉴权的 AccessDecisionManager)
- SecurityContext:安全上下文,保存认证结果。提供了全局上下文、线程继承上下文、线程独立上下文(默认)三种策略。
- Authentication:认证信息,保存用户的身份标示、权限列表、证书、认证通过标记等信息。
- SecuredResource:被安全管控的资源,如 Web URL、用户、角色、自定义领域对象等。
- ConfigAttributes:资源属性配置,描述安全管控资源的信息,为 SecurityInterceptor 提供拦截逻辑的输入。
委托过滤器 SecurityInterceptor
经常能看到下面这张图

实际上通过 Spring Security 内置的一个 Security Interceptor 委托给各个具体的 AccessDecisionManager

配置 AuthenticationConfiguration
AuthenticationConfiguration 负责认证系统的全局配置,GlobalMethodSecurityConfiguration 负责方法调用拦截的全局配置。
构建 AuthenticationManagerBuilder
AuthenticationConfiguration 通过 AuthenticationManagerBuilder 构建认证管理器 AuthenticationManager,GlobalMethodSecurityConfiguration 会自动初始化 AbstractSecurityInterceptor 进行方法调用拦截。
Web 拦截 HttpSecurity
HttpSecurity配置列表:

方法拦截
Spring 通过 AOP技术(cglib/aspectj)对标记为 @PreAuthorize