【Spring Security】如何使用Lambda DSL配置Spring Security

文章介绍了SpringSecurity5.2引入的Lambda表达式配置风格,用于增强DSL功能,提高代码灵活性。Lambda风格简化了HTTPsecurity和WebFluxSecurity的配置,不再需要频繁使用.and()方法,并提供了withDefaults()快捷方式。同时,文章对比了新老配置风格的差异,并指出LambdaDSL旨在提升配置的可读性和一致性。
摘要由CSDN通过智能技术生成



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 ) 拥有相似的配置风格。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡皮巴拉不躺平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值