配置迁移
以下步骤与如何配置HttpSecurity
、WebSecurity
和相关组件的更改有关。
使用 Lambda DSL
从 Spring Security 5.2 版本开始就引入了 Lambda DSL,它允许使用 lambda 表达式配置 HTTP 安全性。
您可能在 Spring Security 文档或示例中看到过这种配置风格。让我们看看 HTTP 安全性的 lambda 配置与之前的配置风格相比有何不同。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/blog/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(formLogin -> formLogin
.loginPage("/login")
.permitAll()
)
.rememberMe(Customizer.withDefaults());
return http.build();
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests()
.requestMatchers("/blog/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.rememberMe();
return http.build();
}
}
Lambda DSL 是配置 Spring Security 的首选方式,之前的配置风格在 Spring Security 7 中将无效,因为在 Spring Security 7 中需要使用 Lambda DSL。主要原因如下:
-
以前的方式不清楚正在配置什么对象,除非知道返回类型是什么。嵌套越深,就越令人困惑。即使是经验丰富的用户也会认为他们的配置正在做一件事,而实际上却在做另一件事。
-
一致性。许多代码库在两种风格之间切换,这导致不一致,使得理解配置变得困难,并且经常导致配置错误。
Lambda DSL 配置技巧
比较上面的两个示例,您会注意到一些关键的区别:
-
在 Lambda DSL 中,无需使用
.and()
方法来链接配置选项。调用 lambda 方法后,HttpSecurity
实例会自动返回以进行进一步配置。 -
Customizer.withDefaults()
使用 Spring Security 提供的默认值启用安全功能。这是 lambda 表达式it → {}
的快捷方式。
WebFlux 安全性
您也可以以类似的方式使用 lambda 配置 WebFlux 安全性。以下是用 lambda 的示例配置。
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange(exchanges -> exchanges
.pathMatchers("/blog/**").permitAll()
.anyExchange().authenticated()
)
.httpBasic(Customizer.withDefaults())
.formLogin(formLogin -> formLogin
.loginPage("/login")
);
return http.build();
}
}
对于自定义 DSL,使用.with()
代替.apply()
在 6.2 之前的版本中,如果您有一个自定义 DSL,您可以使用HttpSecurity#apply(…)
方法将其应用于HttpSecurity
。但是,从 6.2 版本开始,此方法已弃用,并将从 7.0 中移除,因为一旦移除.and()
(参见github.com/spring-projects/spring-security/issues/13067),就将无法再使用.and()
链接配置。建议改用新的.with(…)
方法。有关如何使用.with(…)
的更多信息,请参阅自定义 DSL 部分。