Spring Security 6 認可設定
重要
非推奨の背景: Spring Security 5.8以降、authorizeRequests()
とantMatchers()
は非推奨となり、Spring Security 6.xとSpring Boot 3.xでは完全に**authorizeHttpRequests()
とrequestMatchers()
に置き換え** られました。
問題の詳細
Spring Security 6のアップデートで、従来の認可設定方法が非推奨となりました。以下のようなエラーが発生する場合があります:
// 非推奨メソッド使用例
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
非推奨化による影響
authorizeRequests()
:置き換え必須antMatchers()
:完全削除- 設定を更新しない場合、将来のバージョンで動作しなくなる
最新のSpring Security認可設定
基本設定テンプレート
Spring Security 6.x推奨の設定方法:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(authz -> authz
.requestMatchers("/", "/login", "/signup", "/logout").permitAll() // 認証不要
.requestMatchers("/admin/**").hasRole("ADMIN") // ADMINロール必要
.requestMatchers("/user/**").hasRole("USER") // USERロール必要
.anyRequest().authenticated() // その他は認証必要
);
return http.build();
}
}
機能別完全設定例
ログイン/ログアウトを含む完全な設定:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.cors(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/login", "/signup", "/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.requestMatchers("/api/**").authenticated()
.requestMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
)
.formLogin(login -> login
.loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/user")
.failureUrl("/login?error=true")
)
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/")
)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.build();
}
主な変更点と移行ガイド
1. 認可設定メソッドの置き換え
旧メソッド | 新メソッド |
---|---|
authorizeRequests() | authorizeHttpRequests() |
antMatchers() | requestMatchers() |
2. リクエストマッチャー構文
基本構文:
.requestMatchers("パス1", "パス2").permitAll()
パスタイプ別指定:
.requestMatchers(HttpMethod.GET, "/api/**").permitAll() // GETリクエストのみ許可
3. ロール・権限チェック
.requestMatchers("/admin").hasAuthority("ROLE_ADMIN") // 単一権限
.requestMatchers("/db/**").hasAnyRole("ADMIN", "DBA") // 複数ロール
Spring Boot 3.1+ の注意点
Spring Boot 3.1+ではauthorizeHttpRequests()
ラムダ式も非推奨化される可能性があります。最新の公式移行ガイドで確認してください。
よくある落とし穴と解決策
カスタム認証プロバイダが動作しない
症状:authorizeHttpRequests
移行後、カスタム認証処理が呼ばれない
解決策:
.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class)
静的リソースがブロックされる
設定例:
.requestMatchers(
"/css/**",
"/js/**",
"/images/**"
).permitAll()
ロールプレフィックス問題
// ROLE_プレフィックスが自動付加される(デフォルト動作)
.hasRole("ADMIN") // → "ROLE_ADMIN"をチェック
// プレフィックスなしでチェックする場合
.hasAuthority("ADMIN")
推奨プラクティス
最小権限の原則:
java.requestMatchers("/public/**").permitAll() .anyRequest().denyAll() // 明示的に拒否
静的リソース分離:
java@Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring() .requestMatchers("/favicon.ico", "/resources/**"); }
メソッドセキュリティ併用:
java@EnableMethodSecurity(securedEnabled = true)
移行チェックリスト
- [ ]
authorizeRequests
→authorizeHttpRequests
に置換 - [ ]
antMatchers
→requestMatchers
に置換 - [ ] ログイン/ログアウト設定をラムダ式で更新
- [ ] CSRF/CORS設定を
AbstractHttpConfigurer
スタイルに統一 - [ ] 静的リソースパスを明示的に許可
- [ ] 不要な
@Autowired
を削除(コンストラクタインジェクション推奨)
最新のSpring Securityでは型安全性と明示的設定が強化されています。ラムダ式ベースのDSLを活用することで、設定の意図が明確になり、メンテナンス性が向上します。