Spring Security 6 核心组件详解
一、核心架构组件
-
SecurityFilterChain
- 请求处理的入口点,包含有序的过滤器链
- 每个请求根据匹配规则进入对应的过滤器链
@Bean SecurityFilterChain defaultFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ); return http.build(); }
-
AuthenticationManager
- 认证系统的核心协调器
- 委托给
AuthenticationProvider
执行具体认证
@Bean public AuthenticationManager authenticationManager( AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); }
-
AuthenticationProvider
- 具体认证逻辑执行者(如数据库、LDAP等)
@Bean public DaoAuthenticationProvider daoAuthenticationProvider( PasswordEncoder encoder, UserDetailsService userDetailsService) { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setPasswordEncoder(encoder); provider.setUserDetailsService(userDetailsService); return provider; }
-
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() ); }; }
-
PasswordEncoder
- 密码编码/验证策略
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
-
SecurityContextHolder
- 存储当前安全上下文(线程绑定)
Authentication authentication = SecurityContextHolder .getContext().getAuthentication();
二、认证流程(用户名密码为例)
三、详细认证步骤
-
请求拦截
UsernamePasswordAuthenticationFilter
拦截登录请求(默认/login
)
-
Token创建
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
-
认证委托
Authentication authenticated = authenticationManager.authenticate(authRequest);
-
用户加载
// 在DaoAuthenticationProvider中 UserDetails user = userDetailsService.loadUserByUsername(username);
-
密码验证
passwordEncoder.matches(rawPassword, storedPassword);
-
构建认证对象
return new UsernamePasswordAuthenticationToken( user, credentials, user.getAuthorities() );
-
上下文存储
SecurityContextHolder.getContext().setAuthentication(authenticated);
-
会话管理
- 通过
SecurityContextRepository
将上下文存入Session
- 通过
四、高级认证机制
-
OAuth2 认证流程
-
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(); }
五、核心配置项
配置类 | 作用 | 示例配置方法 |
---|---|---|
HttpSecurity | HTTP请求安全配置 | .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) {
// 认证失败处理
}
}
七、最佳实践
-
多认证源配置
@Bean public AuthenticationManager authManager(HttpSecurity http) throws Exception { return http.getSharedObject(AuthenticationManagerBuilder.class) .authenticationProvider(daoProvider()) .authenticationProvider(ldapProvider()) .build(); }
-
自定义认证过滤器
public class CustomAuthFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { // 自定义认证逻辑 chain.doFilter(request, response); } }
-
方法级安全控制
@PreAuthorize("hasRole('ADMIN') or @customChecker.check(authentication)") public void sensitiveOperation() { // 受保护操作 }
八、调试技巧
-
启用调试日志:
logging.level.org.springframework.security=DEBUG
-
关键断点位置:
FilterChainProxy
:过滤器链入口ProviderManager
:认证提供者路由AbstractUserDetailsAuthenticationProvider
:密码验证核心逻辑
Spring Security 6 的核心改进:
- 全面转向函数式配置
- 移除
WebSecurityConfigurerAdapter
- 增强OAuth2和资源服务器支持
- 优化安全上下文存储策略