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和资源服务器支持
- 优化安全上下文存储策略
Spring Security 6核心组件与认证流程解析
1488

被折叠的 条评论
为什么被折叠?



