Skip to content

Spring Security 6 認可設定

重要

非推奨の背景: Spring Security 5.8以降、authorizeRequests()antMatchers()は非推奨となり、Spring Security 6.xとSpring Boot 3.xでは完全に**authorizeHttpRequests()requestMatchers()に置き換え** られました。

問題の詳細

Spring Security 6のアップデートで、従来の認可設定方法が非推奨となりました。以下のようなエラーが発生する場合があります:

java
// 非推奨メソッド使用例
.authorizeRequests()
    .antMatchers("/public/**").permitAll() 
    .anyRequest().authenticated()

非推奨化による影響

  • authorizeRequests():置き換え必須
  • antMatchers():完全削除
  • 設定を更新しない場合、将来のバージョンで動作しなくなる

最新のSpring Security認可設定

基本設定テンプレート

Spring Security 6.x推奨の設定方法:

java
@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();
    }
}

機能別完全設定例

ログイン/ログアウトを含む完全な設定:

java
@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. リクエストマッチャー構文

基本構文

java
.requestMatchers("パス1", "パス2").permitAll()

パスタイプ別指定

java
.requestMatchers(HttpMethod.GET, "/api/**").permitAll() // GETリクエストのみ許可

3. ロール・権限チェック

java
.requestMatchers("/admin").hasAuthority("ROLE_ADMIN") // 単一権限
.requestMatchers("/db/**").hasAnyRole("ADMIN", "DBA") // 複数ロール

Spring Boot 3.1+ の注意点

Spring Boot 3.1+ではauthorizeHttpRequests()ラムダ式も非推奨化される可能性があります。最新の公式移行ガイドで確認してください。

よくある落とし穴と解決策

カスタム認証プロバイダが動作しない

症状authorizeHttpRequests移行後、カスタム認証処理が呼ばれない
解決策

java
.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class)

静的リソースがブロックされる

設定例

java
.requestMatchers(
    "/css/**", 
    "/js/**", 
    "/images/**"
).permitAll()

ロールプレフィックス問題

java
// ROLE_プレフィックスが自動付加される(デフォルト動作)
.hasRole("ADMIN") // → "ROLE_ADMIN"をチェック

// プレフィックスなしでチェックする場合
.hasAuthority("ADMIN")

推奨プラクティス

  1. 最小権限の原則

    java
    .requestMatchers("/public/**").permitAll()
    .anyRequest().denyAll() // 明示的に拒否
  2. 静的リソース分離

    java
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
         return (web) -> web.ignoring()
             .requestMatchers("/favicon.ico", "/resources/**");
     }
  3. メソッドセキュリティ併用

    java
    @EnableMethodSecurity(securedEnabled = true)

移行チェックリスト

  • [ ] authorizeRequestsauthorizeHttpRequests に置換
  • [ ] antMatchersrequestMatchers に置換
  • [ ] ログイン/ログアウト設定をラムダ式で更新
  • [ ] CSRF/CORS設定をAbstractHttpConfigurerスタイルに統一
  • [ ] 静的リソースパスを明示的に許可
  • [ ] 不要な@Autowiredを削除(コンストラクタインジェクション推奨)

最新のSpring Securityでは型安全性明示的設定が強化されています。ラムダ式ベースのDSLを活用することで、設定の意図が明確になり、メンテナンス性が向上します。