Spring Security 的核心配置项详解,涵盖认证、授权、过滤器链、HTTP安全设置等关键配置,结合 Spring Boot 3.x 版本最佳实践
以下是 Spring Security 的核心配置项详解,涵盖认证、授权、过滤器链、HTTP安全设置等关键配置,结合 Spring Boot 3.x 版本最佳实践:
1. 核心注解与配置类
(1) 启动安全配置
// 启动Web安全配置(推荐方式)
@Configuration
@EnableWebSecurity // 启用Web安全配置
public class SecurityConfig {// 定义SecurityFilterChain Bean
}
- @EnableWebSecurity:
- 启用安全框架,自动配置默认的安全过滤器链。
- 替代旧版
WebSecurityConfigurerAdapter
(已弃用)。
(2) 方法级安全
// 启用方法注解(如@PreAuthorize)
@EnableMethodSecurity // Spring Security 5.7+ 版本
public class MethodSecurityConfig {
}
- @EnableMethodSecurity:
- 支持
@PreAuthorize
、@PostFilter
、@Secured
等注解,实现方法级权限控制。
- 支持
2. 安全过滤器链(SecurityFilterChain)
(1) 基础配置
@Configuration
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// 配置HTTP安全选项.authorizeRequests(authz -> authz.antMatchers("/public/**").permitAll() // 公开接口.antMatchers("/admin/**").hasRole("ADMIN") // 需ADMIN角色.anyRequest().authenticated() // 其他接口需认证).formLogin() // 启用表单登录.httpBasic() // 启用HTTP Basic认证.csrf(csrf -> csrf.disable()); // 禁用CSRF(测试环境)return http.build();}
}
(2) 关键配置项详解
配置项 | 作用 | 代码示例 |
---|---|---|
authorizeRequests | 定义URL权限规则 | .antMatchers("/api/**").authenticated() |
formLogin | 配置表单登录 | .formLogin().loginPage("/login").permitAll() |
httpBasic | 启用HTTP Basic认证 | .httpBasic().disable() |
csrf | 配置CSRF防护 | .csrf().disable() 或 .csrf().requireCsrfProtectionMatcher(...) |
rememberMe | 启用“记住我”功能 | .rememberMe().key("uniqueKey").tokenValiditySeconds(86400) |
logout | 配置退出登录 | .logout().logoutUrl("/logout").logoutSuccessUrl("/") |
sessionManagement | 会话管理(如会话固定、超时) | .sessionManagement().maximumSessions(1) |
oauth2Login | 配置OAuth2登录 | .oauth2Login().loginPage("/login").defaultSuccessUrl("/home") |
securityContext | 安全上下文配置(如会话持久化) | .securityContext().requireExplicitSave() |
3. 认证配置
(1) 用户认证源
// 内存用户配置
@Bean
public InMemoryUserDetailsManager userDetailsService() {return new InMemoryUserDetailsManager(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
}
(2) 自定义用户DetailsService
@Service
public class DatabaseUserDetailsService implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) {// 从数据库加载用户User user = userRepository.findByUsername(username);return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),AuthorityUtils.createAuthorityList(user.getRoles()));}
}
(3) 密码编码器
@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}
4. 过滤器与拦截器
(1) 自定义Filter
@Component
public class CustomFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 自定义逻辑(如Token解析)chain.doFilter(request, response);}
}// 注册到FilterChain
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) {http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class);return http.build();
}
(2) 过滤器顺序
Spring Security 默认过滤器顺序(部分关键Filter):
ChannelProcessingFilter
:处理协议强制(如HTTPS)。WebAsyncManagerIntegrationFilter
:处理异步请求。SecurityContextPersistenceFilter
:保存/恢复安全上下文。HeaderWriterFilter
:添加安全头(如X-Content-Type-Options)。CsrfFilter
:处理CSRF令牌。LogoutFilter
:处理退出请求。UsernamePasswordAuthenticationFilter
:表单登录认证。OAuth2LoginAuthenticationFilter
:OAuth2登录认证。
5. 异常处理
(1) 未认证处理
@Bean
public AuthenticationEntryPoint authenticationEntryPoint() {return (request, response, authException) ->response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "未认证");
}
(2) 无权限处理
@Bean
public AccessDeniedHandler accessDeniedHandler() {return (request, response, accessDeniedException) ->response.sendError(HttpServletResponse.SC_FORBIDDEN, "无权限");
}
6. 高级配置
(1) OAuth2资源服务器
@Configuration
public class OAuth2Config {@Beanpublic SecurityFilterChain resourceServerSecurityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/**").authenticated().and().oauth2ResourceServer().jwt(); // 启用JWT解析return http.build();}
}
(2) 动态权限(ABAC)
// 自定义权限表达式
@Configuration
@EnableMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {@Overrideprotected MethodSecurityExpressionHandler createExpressionHandler() {DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();handler.setPermissionEvaluator(new CustomPermissionEvaluator());return handler;}
}
7. 关键配置总结表格
配置类型 | 配置项 | 作用 | 代码示例 |
---|---|---|---|
认证 | userDetailsService | 定义用户信息来源(数据库/内存) | @Bean DatabaseUserDetailsService |
密码 | passwordEncoder | 密码编码器(如BCrypt) | @Bean BCryptPasswordEncoder() |
HTTP安全 | authorizeRequests | 定义URL权限规则 | .antMatchers("/api/**").hasRole("USER") |
登录 | formLogin | 表单登录配置 | .formLogin().loginPage("/login") |
退出 | logout | 退出登录配置 | .logout().logoutUrl("/logout") |
CSRF | csrf | 开启/禁用CSRF防护 | .csrf().disable() |
会话管理 | sessionManagement | 会话超时、并发控制 | .sessionManagement().invalidSessionUrl("/login") |
OAuth2登录 | oauth2Login | 配置OAuth2登录(如Google、GitHub) | .oauth2Login().clientId("your-client-id") |
方法级安全 | @EnableMethodSecurity | 启用方法注解(@PreAuthorize ) | @EnableMethodSecurity(prePostEnabled = true) |
自定义Filter | addFilterBefore/After | 注册自定义Filter到FilterChain | http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class) |
8. 常见问题与解决
-
随机生成密码问题:
- 日志:
Using generated security password:
- 解决:添加
management.security.enabled=false
禁用默认安全配置。
- 日志:
-
CSRF跨域问题:
- 在前端请求头中添加
X-XSRF-TOKEN
和Cookie
。
- 在前端请求头中添加
-
JWT Token配置:
- 需添加
spring-boot-starter-oauth2-resource-server
依赖,并配置密钥。
- 需添加
9. 总结
Spring Security 的配置项覆盖了从 认证、授权、过滤器链 到 高级安全策略 的所有场景,核心是通过 SecurityFilterChain
定义安全规则。在 Spring Boot 3.x 中,需避免使用已弃用的 WebSecurityConfigurerAdapter
,转而直接创建 SecurityFilterChain
Bean。通过灵活组合配置项,可满足从简单到复杂的系统安全需求。