 
 
1. 概述
在 Spring Security 5.2 中增强了 DSL 的功能:允许使用 Lambda 表达式来配置 HTTP security 。
需要注意的是:先前版本的配置风格仍然是有效的且受支持的。Spring 官方额外新增 Lambda 表达式是为了提高代码的灵活性,只是一个可选的用法。
下面让我们看一下 Lambda 表达式配置 HTTP security 和先前的配置风格的对比。
2. 新老配置风格对比
Lambda风格
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
   
    @Override
    protected void configure(HttpSecurity http) throws Exception {
   
        http
            .authorizeRequests(authorizeRequests ->
                authorizeRequests
                    .antMatchers("/blog/**").permitAll()
                    .anyRequest().authenticated()
            )
            .formLogin(formLogin ->
                formLogin
                    .loginPage("/login")
                    .permitAll()
            )
            .rememberMe(withDefaults());
    }
}
 等效的旧配置风格
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
   
    @Override
    protected void configure(HttpSecurity http) throws Exception {
   
        http
            .authorizeRequests()
                .antMatchers("/blog/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .rememberMe();
    }
}
 对比上述两种配置风格,你会注意到一些关键的不同点:
-  在 Lambda 风格中,不再需要通过 .and()方法来串联配置项。在调用 Lambda 方法后, HttpSecurity对象http会自动返回以继续执行进一步的配置。
-  方法 withDefaults()可以使用 Spring Security 提供的默认值启用安全功能。这是 Lambda 表达式it -> {}的快捷方式。
3. WebFlux Security
此外,你还可以使用 Lambda 表达式来配置 WebFlux security ,配置方式与上面基本相似。
举个例子:
@EnableWebFluxSecurity
public class SecurityConfig {
   
    @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
   
        http
            .authorizeExchange(exchanges ->
                exchanges
                    .pathMatchers("/blog/**").permitAll()
                    .anyExchange().authenticated()
            )
            .httpBasic(withDefaults())
            .formLogin(formLogin ->
                formLogin
                    .loginPage("/login")
            );
        return http.build();
    }
}
 4. Lambda DSL的目标
Lambda DSL 被开发出来,是为了完成以下的目的:
- 自动缩进以提高配置的可读性。
- 不再需要使用 .and()方法来串联配置项。
- Spring Security DSL 与其他 Spring DSLs (例如 Spring Integration 和 Spring Cloud Gateway ) 拥有相似的配置风格。
转载:https://blog.csdn.net/Sihang_Xie/article/details/128748845
查看评论
					 
					