此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.4.1! |
配置迁移
以下步骤与有关如何配置 和相关组件的更改相关。HttpSecurity
WebSecurity
使用 Lambda DSL
Lambda DSL 自 5.2 版起存在于 Spring Security 中,它允许使用 Lambda 配置 HTTP 安全性。
您可能已经在 Spring Security 文档或示例中看到了这种风格的配置。 让我们看一下 HTTP 安全性的 lambda 配置与之前的配置样式的比较。
使用 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();
}
}
不使用 lambda 的等效配置
@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 的首选方式,之前的配置样式在需要使用 Lambda DSL 的 Spring Security 7 中无效。 这样做主要有几个原因:
-
以前的方法在不知道返回类型是什么的情况下不清楚要配置什么对象。 嵌套越深,它就越令人困惑。 即使是有经验的用户也会认为他们的配置在做一件事,而实际上,它正在做其他事情。
-
一致性。 许多代码库在两种样式之间切换,这会导致不一致,从而难以理解配置,并经常导致配置错误。
Lambda DSL 配置提示
在比较上述两个示例时,您会注意到一些关键差异:
-
在 Lambda DSL 中,无需使用该方法链接配置选项。 调用 lambda 方法后,将自动返回实例以供进一步配置。
.and()
HttpSecurity
-
Customizer.withDefaults()
使用 Spring Security 提供的默认值启用安全功能。 这是 lambda 表达式的快捷方式。it → {}
WebFlux 安全性
您也可以以类似的方式使用 lambda 配置 WebFlux 安全性。 以下是使用 Lambda 的示例配置。
使用 lambda 的 WebFlux 配置
@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();
}
}