123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- = Configuration Migrations
- The following steps relate to changes around how to configure `HttpSecurity`, `WebSecurity` and related components.
- == Use the Lambda DSL
- The Lambda DSL is present in Spring Security since version 5.2, and it allows HTTP security to be configured using lambdas.
- You may have seen this style of configuration in the Spring Security documentation or samples.
- Let us take a look at how a lambda configuration of HTTP security compares to the previous configuration style.
- [source,java]
- .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();
- }
- }
- ----
- [source,java]
- .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();
- }
- }
- ----
- The Lambda DSL is the preferred way to configure Spring Security, the prior configuration style will not be valid in Spring Security 7 where the usage of the Lambda DSL will be required.
- This has been done mainly for a couple of reasons:
- - The previous way it was not clear what object was getting configured without knowing what the return type was.
- The deeper the nesting the more confusing it became.
- Even experienced users would think that their configuration was doing one thing when in fact, it was doing something else.
- - Consistency.
- Many code bases switched between the two styles which caused inconsistencies that made understanding the configuration difficult and often led to misconfigurations.
- === Lambda DSL Configuration Tips
- When comparing the two samples above, you will notice some key differences:
- - In the Lambda DSL there is no need to chain configuration options using the `.and()` method.
- The `HttpSecurity` instance is automatically returned for further configuration after the call to the lambda method.
- - `Customizer.withDefaults()` enables a security feature using the defaults provided by Spring Security.
- This is a shortcut for the lambda expression `it -> {}`.
- === WebFlux Security
- You may also configure WebFlux security using lambdas in a similar manner.
- Below is an example configuration using lambdas.
- [source,java]
- .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();
- }
- }
- ----
- === Goals of the Lambda DSL
- The Lambda DSL was created to accomplish to following goals:
- - Automatic indentation makes the configuration more readable.
- - There is no need to chain configuration options using `.and()`
- - The Spring Security DSL has a similar configuration style to other Spring DSLs such as Spring Integration and Spring Cloud Gateway.
- == Use `.with()` instead of `.apply()` for Custom DSLs
- In versions prior to 6.2, if you had a xref:servlet/configuration/java.adoc#jc-custom-dsls[custom DSL], you would apply it to the `HttpSecurity` using the `HttpSecurity#apply(...)` method.
- However, starting from version 6.2, this method is deprecated and will be removed in 7.0 because it will no longer be possible to chain configurations using `.and()` once `.and()` is removed (see https://github.com/spring-projects/spring-security/issues/13067).
- Instead, it is recommended to use the new `.with(...)` method.
- For more information about how to use `.with(...)` please refer to the xref:servlet/configuration/java.adoc#jc-custom-dsls[Custom DSLs section].
|