SpringSecurity笔记

SpringSecurity笔记

起男 26 2025-05-28

SpringSecurity笔记

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,是保护基于 Spring 的应用程序的事实标准

过滤器链 (Filter Chain)

Spring Security 本质上是一个 Servlet 过滤器链,在 web 请求到达控制器之前进行安全处理:

  • DelegatingFilterProxy:作为入口点,将请求委托给 Spring 管理的 FilterChainProxy
  • FilterChainProxy:包含多个安全过滤器,按顺序处理请求
  • SecurityFilterChain:决定哪些过滤器应用于当前请求

关键过滤器

  1. SecurityContextPersistenceFilter:在请求间存储安全上下文
  2. UsernamePasswordAuthenticationFilter:处理表单登录
  3. BasicAuthenticationFilter:处理 HTTP 基本认证
  4. RememberMeAuthenticationFilter:处理"记住我"功能
  5. AnonymousAuthenticationFilter:为未认证用户分配匿名身份
  6. SessionManagementFilter:处理会话相关功能
  7. ExceptionTranslationFilter:处理安全异常
  8. FilterSecurityInterceptor:进行访问控制决策

认证流程

  1. 用户提交凭证(用户名/密码等)
  2. 认证管理器(AuthenticationManager)委托给 AuthenticationProvider
  3. Provider 使用 UserDetailsService 加载用户信息
  4. 密码编码器(PasswordEncoder)验证密码
  5. 认证成功后构建 Authentication 对象
  6. 安全上下文(SecurityContextHolder)存储认证信息
Authentication authentication = authenticationManager.authenticate(
    new UsernamePasswordAuthenticationToken(username, password)
);
SecurityContextHolder.getContext().setAuthentication(authentication);

授权流程

  1. 访问受保护资源时触发授权检查
  2. AccessDecisionManager 基于投票机制做决策
  3. 配置的投票器(Voter)根据安全规则投票
  4. 基于投票结果允许或拒绝访问

安全上下文传播

  • SecurityContextHolder:存储当前安全上下文
  • ThreadLocal 策略:默认将上下文绑定到当前线程
  • SecurityContextRepository:跨请求持久化上下文(通常使用 HTTP Session)

核心组件

  1. Authentication:表示认证主体及其凭证
  2. UserDetails:用户核心信息接口
  3. UserDetailsService:加载用户特定数据
  4. GrantedAuthority:授予主体的权限
  5. AuthenticationManager:认证的主要接口
  6. ProviderManager:AuthenticationManager 的标准实现
  7. AccessDecisionManager:授权决策的核心接口

规则配置

Spring Security 的配置主要通过两个关键类:

  1. WebSecurityConfigurerAdapter (旧版)或 SecurityFilterChain (新版)
  2. 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();
    }
}

安全机制

  1. CSRF 防护:默认启用,防止跨站请求伪造
  2. CORS 支持:跨域资源共享配置
  3. Session 管理:会话固定保护、并发控制等
  4. HTTP 安全头:自动添加安全相关 HTTP 头
  5. 方法级安全:通过注解实现方法级别的访问控制