


SecurityConfigurer 是 Spring Security 配置的构建块。每个 SecurityConfigurer 负责配置安全对象的一个方面。
配置过程分为两个阶段:
- init():初始化配置
- configure():应用配置到 Security 对象
postProcess():配置完成后的钩子
postProcess() 方法在安全对象配置完成后调用。这是修改或增强已配置对象的最佳时机。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class CustomSecurityConfigurerAdapter extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
@Override public void configure(HttpSecurity builder) throws Exception { }
@Override public void postProcess(HttpSecurity http) { http.getSharedObject(AuthenticationManagerBuilder.class) .authenticationProvider(customProvider()); } }
|
常见的使用场景
场景一:注入自定义 Filter
1 2 3 4 5 6 7 8 9 10
| @Bean public SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> customFilterConfigurer() { return new SecurityConfigurerAdapter<>() { @Override public void configure(HttpSecurity builder) { builder.addFilterBefore(customFilter(), UsernamePasswordAuthenticationFilter.class); } }; }
|
场景二:修改默认的 AuthenticationManager
1 2 3 4 5 6
| @Override public void postProcess(HttpSecurity http) { AuthenticationManager authManager = http.getSharedObject( AuthenticationManager.class); }
|
场景三:条件化配置
1 2 3 4 5 6 7 8 9 10 11 12
| @Bean public SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> conditionalConfigurer() { return new SecurityConfigurerAdapter<>() { @Override public void configure(HttpSecurity builder) { if (environment.acceptsProfiles("prod")) { builder.httpHeaders().frameOptions().deny(); } } }; }
|
注意事项
postProcess() 在 configure() 之后调用,此时安全对象已经完成基本配置
- 不应该在
postProcess() 中修改已经构建好的 SecurityFilterChain,而应该修改共享对象
- 多个
SecurityConfigurer 的 postProcess() 调用顺序取决于它们被添加到配置中的顺序
postProcess() 是可选的,大多数场景只需要 configure() 就够了