SpringSecurity笔记
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,是保护基于 Spring 的应用程序的事实标准
过滤器链 (Filter Chain)
Spring Security 本质上是一个 Servlet 过滤器链,在 web 请求到达控制器之前进行安全处理:
- DelegatingFilterProxy:作为入口点,将请求委托给 Spring 管理的
FilterChainProxy
- FilterChainProxy:包含多个安全过滤器,按顺序处理请求
- SecurityFilterChain:决定哪些过滤器应用于当前请求
关键过滤器
- SecurityContextPersistenceFilter:在请求间存储安全上下文
- UsernamePasswordAuthenticationFilter:处理表单登录
- BasicAuthenticationFilter:处理 HTTP 基本认证
- RememberMeAuthenticationFilter:处理"记住我"功能
- AnonymousAuthenticationFilter:为未认证用户分配匿名身份
- SessionManagementFilter:处理会话相关功能
- ExceptionTranslationFilter:处理安全异常
- FilterSecurityInterceptor:进行访问控制决策
认证流程
- 用户提交凭证(用户名/密码等)
- 认证管理器(AuthenticationManager)委托给 AuthenticationProvider
- Provider 使用 UserDetailsService 加载用户信息
- 密码编码器(PasswordEncoder)验证密码
- 认证成功后构建 Authentication 对象
- 安全上下文(SecurityContextHolder)存储认证信息
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(username, password)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
授权流程
- 访问受保护资源时触发授权检查
- AccessDecisionManager 基于投票机制做决策
- 配置的投票器(Voter)根据安全规则投票
- 基于投票结果允许或拒绝访问
安全上下文传播
- SecurityContextHolder:存储当前安全上下文
- ThreadLocal 策略:默认将上下文绑定到当前线程
- SecurityContextRepository:跨请求持久化上下文(通常使用 HTTP Session)
核心组件
- Authentication:表示认证主体及其凭证
- UserDetails:用户核心信息接口
- UserDetailsService:加载用户特定数据
- GrantedAuthority:授予主体的权限
- AuthenticationManager:认证的主要接口
- ProviderManager:AuthenticationManager 的标准实现
- AccessDecisionManager:授权决策的核心接口
规则配置
Spring Security 的配置主要通过两个关键类:
- WebSecurityConfigurerAdapter (旧版)或 SecurityFilterChain (新版)
- HttpSecurity:配置具体的 HTTP 安全规则
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
}
安全机制
- CSRF 防护:默认启用,防止跨站请求伪造
- CORS 支持:跨域资源共享配置
- Session 管理:会话固定保护、并发控制等
- HTTP 安全头:自动添加安全相关 HTTP 头
- 方法级安全:通过注解实现方法级别的访问控制