Spring Security 5.2 对 Lambda DSL 语法的增强,允许使用lambda配置 HttpSecurity
、 ServerHttpSecurity
重要提醒,之前的配置方法仍然有效。lambda的添加旨在提供更大的灵活性,但是用法是可选的。让我们看一下 HttpSecurity
的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 DSL配置技巧
比较上面的两个样本时,您会注意到一些关键差异:
在Lambda DSL中,无需使用 .and()
方法链接配置选项。 HttpSecurity
调用 Lambda
方法之后实例自动返回进行进一步的配置。
@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(); } }
Spring SecurityLambda DSL 自动缩进使配置更具可读性、不需要使用链接配置选项.and()。
Spring Security DSL
与其他 Spring DSL
(例如Spring Integration和Spring Cloud Gateway)具有类似的配置方法。