Spring Security 教程(14)、已配置对象的后续处理

SecurityConfigurer 的生命周期

post-postprocessing 配图
post-postprocessing 配图
post-postprocessing 配图

SecurityConfigurer 是 Spring Security 配置的构建块。每个 SecurityConfigurer 负责配置安全对象的一个方面。

配置过程分为两个阶段:

  1. init():初始化配置
  2. 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);
// 修改或替换 AuthenticationManager
}

场景三:条件化配置

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() 就够了