構成の移行
次の手順は、HttpSecurity
、WebSecurity
、関連コンポーネントの構成方法に関する変更に関連しています。
Lambda DSL を使用する
Lambda DSL はバージョン 5.2 以降の Spring Security に存在し、ラムダを使用して HTTP セキュリティを構成できるようにします。
このスタイルの構成は、Spring Security のドキュメントまたはサンプルで見たことがあるかもしれません。HTTP セキュリティのラムダ構成が以前の構成スタイルとどのように比較されるかを見てみましょう。
@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();
}
}
@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 を設定するための推奨される方法です。以前の設定スタイルは、Lambda DSL の使用が必要な Spring Security 7 では無効になります。これは主に次のような理由から行われています。
以前の方法では、戻り値の型が分からないと、どのオブジェクトが設定されているのかが明確ではありませんでした。ネストが深くなるほど、混乱はさらに増しました。経験豊富なユーザーであっても、実際には別のことを行っているにもかかわらず、構成が 1 つのことを行っていると考えることがあります。
一貫性。多くのコードベースでは 2 つのスタイルの間で切り替えが行われていたため、不整合が発生し、構成の理解が困難になり、構成ミスが発生することがよくありました。
Lambda DSL 設定のヒント
上記の 2 つのサンプルを比較すると、いくつかの重要な違いに気付くでしょう。
Lambda DSL では、
.and()
メソッドを使用して チェーン構成オプションを設定する必要はありません。HttpSecurity
インスタンスは、ラムダメソッドの呼び出し後、さらに構成するために自動的に返されます。Customizer.withDefaults()
は、Spring Security によって提供されるデフォルトを使用してセキュリティ機能を有効にします。これは、ラムダ式it → {}
のショートカットです。
WebFlux セキュリティ
同様の方法で、ラムダを使用して WebFlux セキュリティを構成することもできます。以下は、ラムダを使用した構成の例です。
@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 には .apply()
の代わりに .with()
を使用します
6.2 より前のバージョンでは、カスタム DSL がある場合は、HttpSecurity#apply(…)
メソッドを使用してそれを HttpSecurity
に適用します。ただし、バージョン 6.2 以降、このメソッドは非推奨となり、7.0 で削除されます。これは、.and()
が削除されると、.and()
を使用して チェーン構成を行うことができなくなるためです (github.com/spring-projects/spring-security/issues/13067 (英語) を参照)。代わりに、新しい .with(…)
メソッドを使用することをお勧めします。.with(…)
の使用方法の詳細については、カスタム DSL セクションを参照してください。