Spring Security 6 【13-核心组件和认证流程】

Spring Security 6 核心组件详解

一、核心架构组件
  1. SecurityFilterChain

    • 请求处理的入口点,包含有序的过滤器链
    • 每个请求根据匹配规则进入对应的过滤器链
    @Bean
    SecurityFilterChain defaultFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            );
        return http.build();
    }
    
  2. AuthenticationManager

    • 认证系统的核心协调器
    • 委托给AuthenticationProvider执行具体认证
    @Bean
    public AuthenticationManager authenticationManager(
            AuthenticationConfiguration config) throws Exception {
        return config.getAuthenticationManager();
    }
    
  3. AuthenticationProvider

    • 具体认证逻辑执行者(如数据库、LDAP等)
    @Bean
    public DaoAuthenticationProvider daoAuthenticationProvider(
            PasswordEncoder encoder, UserDetailsService userDetailsService) {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setPasswordEncoder(encoder);
        provider.setUserDetailsService(userDetailsService);
        return provider;
    }
    
  4. UserDetailsService

    • 加载用户数据的核心接口
    @Bean
    public UserDetailsService userDetailsService() {
        return username -> {
            User user = userRepository.findByUsername(username);
            return new org.springframework.security.core.userdetails.User(
                    user.getUsername(),
                    user.getPassword(),
                    user.getAuthorities()
            );
        };
    }
    
  5. PasswordEncoder

    • 密码编码/验证策略
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
  6. SecurityContextHolder

    • 存储当前安全上下文(线程绑定)
    Authentication authentication = SecurityContextHolder
          .getContext().getAuthentication();
    
二、认证流程(用户名密码为例)
Client FilterChain AuthFilter AuthManager AuthProvider UserDetailsService SecurityContextHolder 提交登录请求 转发到认证过滤器 创建AuthenticationToken 委托认证 加载用户数据 返回UserDetails 密码比对 返回认证结果 返回Authentication 存储认证信息 返回认证成功响应 Client FilterChain AuthFilter AuthManager AuthProvider UserDetailsService SecurityContextHolder
三、详细认证步骤
  1. 请求拦截

    • UsernamePasswordAuthenticationFilter 拦截登录请求(默认/login
  2. Token创建

    UsernamePasswordAuthenticationToken authRequest = 
        new UsernamePasswordAuthenticationToken(username, password);
    
  3. 认证委托

    Authentication authenticated = authenticationManager.authenticate(authRequest);
    
  4. 用户加载

    // 在DaoAuthenticationProvider中
    UserDetails user = userDetailsService.loadUserByUsername(username);
    
  5. 密码验证

    passwordEncoder.matches(rawPassword, storedPassword);
    
  6. 构建认证对象

    return new UsernamePasswordAuthenticationToken(
        user, 
        credentials, 
        user.getAuthorities()
    );
    
  7. 上下文存储

    SecurityContextHolder.getContext().setAuthentication(authenticated);
    
  8. 会话管理

    • 通过SecurityContextRepository将上下文存入Session
四、高级认证机制
  1. OAuth2 认证流程

    授权请求
    授权码
    授权码+密钥
    验证令牌
    返回资源
    客户端
    授权服务器
    资源服务器
  2. JWT 认证流程

    @Bean
    public SecurityFilterChain jwtFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
    
五、核心配置项
配置类作用示例配置方法
HttpSecurityHTTP请求安全配置.authorizeHttpRequests()
WebSecurity全局Web安全配置.ignoring().requestMatchers()
AuthenticationManager认证管理器配置.authenticationProvider()
SessionManagement会话管理策略.sessionCreationPolicy()
RememberMeConfigurer记住我功能配置.rememberMe().key()
六、认证事件体系
@Component
public class AuthenticationEventListener {
    @EventListener
    public void onSuccess(AuthenticationSuccessEvent event) {
        // 认证成功处理
    }
    
    @EventListener
    public void onFailure(AbstractAuthenticationFailureEvent event) {
        // 认证失败处理
    }
}
七、最佳实践
  1. 多认证源配置

    @Bean
    public AuthenticationManager authManager(HttpSecurity http) throws Exception {
        return http.getSharedObject(AuthenticationManagerBuilder.class)
            .authenticationProvider(daoProvider())
            .authenticationProvider(ldapProvider())
            .build();
    }
    
  2. 自定义认证过滤器

    public class CustomAuthFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, 
                                        HttpServletResponse response, 
                                        FilterChain chain) {
            // 自定义认证逻辑
            chain.doFilter(request, response);
        }
    }
    
  3. 方法级安全控制

    @PreAuthorize("hasRole('ADMIN') or @customChecker.check(authentication)")
    public void sensitiveOperation() {
        // 受保护操作
    }
    
八、调试技巧
  1. 启用调试日志:

    logging.level.org.springframework.security=DEBUG
    
  2. 关键断点位置:

    • FilterChainProxy:过滤器链入口
    • ProviderManager:认证提供者路由
    • AbstractUserDetailsAuthenticationProvider:密码验证核心逻辑

Spring Security 6 的核心改进:

  • 全面转向函数式配置
  • 移除WebSecurityConfigurerAdapter
  • 增强OAuth2和资源服务器支持
  • 优化安全上下文存储策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值