配置迁移

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

下面的步骤涉及到围绕如何配置 HttpSecurityWebSecurity 和相关组件的变化。

使用 Lambda DSL

Lambda DSL 从5.2版本开始出现在 Spring Security 中,它允许使用 lambda 来配置HTTP security。

你可能已经在 Spring Security 的文档或示例中看到了这种配置风格。让我们来看看 HTTP security 的 lambda 配置与之前的配置风格相比有什么不同。

Configuration using lambdas
@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();
    }
}
Equivalent configuration without using lambdas
@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 中是无效的,因为那里需要使用 Lambda DSL。这样做主要是出于以下几个原因:

  • 以前的方法在不知道返回类型的情况下,并不清楚什么对象被配置了。嵌套越深,就越令人困惑。即使是有经验的用户也会认为他们的配置在做一件事,而事实上,它在做别的事。

  • 一致性。许多代码库在两种风格之间切换,这造成了不一致,使人难以理解配置,并经常导致错误的配置。

Lambda DSL 配置技巧

在比较上述两个示例时,你会注意到一些关键的差异:

  • 在 Lambda DSL 中,不需要使用 .and() 方法来链式配置选项。在调用 lambda 方法后, HttpSecurity 实例会自动返回,以便进一步配置。

  • Customizer.withDefaults() 使用 Spring Security 提供的默认值启用一个安全功能。这是 lambda 表达式 it → {} 的一个快捷方式。

WebFlux Security

你也可以以类似的方式使用 lambda 来配置 WebFlux security。下面是一个使用 lambda 配置的例子。

WebFlux configuration using lambdas
@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();
    }

}

Lambda DSL 的目标

创建 Lambda DSL 是为了实现以下目标:

  • 自动缩进使配置更具可读性。

  • 不需要使用 .and() 链式配置选项。

  • Spring Security DSL 的配置风格与 Spring Integration 和 Spring Cloud Gateway 等其他 Spring DSL 类似。

对自定义DSL使用 .with() 而不是 .apply()

在6.2之前的版本中,如果你有一个 自定义的DSL,你可以使用 HttpSecurity#apply(…​) 方法将其应用到 HttpSecurity 中。然而,从6.2版本开始,这个方法被废弃了,并将在7.0版本中被移除,因为一旦 .and() 被移除,将不再可能使用 .and() 来链式配置(见 github.com/spring-projects/spring-security/issues/13067 )。相反,我们建议使用新的 .with(…​) 方法。关于如何使用 .with(…​) 的更多信息,请参考 自定义 DSL 部分