@EnableWebSecurityの使い方と引数を徹底解説!【初心者向け】

@EnableWebSecurityとは?

@EnableWebSecurityとは、Spring Securityのカスタムセキュリティ設定を有効にするためのアノテーションです。

Spring Bootアプリケーションで@EnableWebSecurityを追加すると、Spring Bootが提供するデフォルトのセキュリティ設定が無効になり、代わりに開発者が設定をコントロールできるようになります。

通常、Spring Bootにはデフォルトで基本的なセキュリティが組み込まれており、ログイン画面や初期パスワードの自動生成など、様々な機能があります。
しかし、アプリケーション固有のカスタムセキュリティ設定をしたい場合は、このデフォルト設定を無効にして、新たに設定を追加する必要があります。@EnableWebSecurityはそのスタート地点となります。


基本的な使い方

まずは、@EnableWebSecurityを指定するシンプルなクラスを作成しましょう。カスタマイズを行わない限り、基本的には@EnableWebSecurityを追加するだけでOKです。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    // カスタマイズがない場合、このままでOK
}

@EnableWebSecurityでできること

@EnableWebSecurityを使うと、Spring Securityの以下のような機能をカスタマイズできるようになります:

1. リクエストの認証と許可

たとえば、特定のURLに対してアクセス制御を行うことができます。これにより、認証が必要なエンドポイントと不要なエンドポイントを柔軟に設定可能です。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public").permitAll()  // 認証不要のエンドポイント
                .antMatchers("/admin").hasRole("ADMIN")  // ADMINロールが必要
                .anyRequest().authenticated()  // それ以外は認証済みユーザーのみ
            .and()
            .formLogin();
    }
}
  • /publicは誰でもアクセス可能
  • /adminADMINロールを持つユーザーのみアクセス可能
  • その他のエンドポイントは、認証が必要です。

2. 認証方式の設定

認証方式(たとえば、フォームベース認証、HTTP Basic認証、JWT認証)をアプリケーションに合わせて選択できます。デフォルトではフォーム認証が使用されますが、設定を変更することで独自の認証方式を実装できます。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .httpBasic()  // HTTP Basic認証を使用
            .and()
            .formLogin();  // フォーム認証も使用可能
    }
}
  • httpBasic()を使うと、HTTP Basic認証が有効になります。
  • formLogin()を併用することで、フォームベースの認証も追加できます。

3. ユーザー情報のカスタマイズ

@EnableWebSecurityによって、データベースやメモリにユーザー情報を保存する設定もカスタマイズ可能です。これにより、ユーザー情報を管理したり、ロール(役割)に基づいたアクセス制御を簡単に実装できます。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        
        UserDetails admin = User.withDefaultPasswordEncoder()
                .username("admin")
                .password("admin")
                .roles("ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user, admin);
    }
}
  • user: USERロールを持ち、パスワードはpassword
  • admin: ADMINロールを持ち、パスワードはadmin

実装例

具体的にどのように設定をカスタマイズできるか、もう少し進んだ例を見てみましょう。

カスタムセキュリティ設定の追加

以下のコードでは、すべてのエンドポイントに対して認証を必要とするセキュリティ設定を行っています。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated() // すべてのリクエストに認証が必要
            .and()
            .formLogin() // デフォルトのログインページを有効にする
            .and()
            .httpBasic(); // Basic認証も許可

        return http.build();
    }
}

この設定を追加することで、アプリケーションにアクセスする際に、ログインが必要になります。また、デフォルトのログインページが生成され、フォームベース認証とHTTP Basic認証の両方が利用できるようになります。


@EnableWebSecurityを使ったセキュリティの詳細なカスタマイズ

さらに詳細なカスタマイズが可能です。例えば、以下のような設定も@EnableWebSecurityの範囲内で行えます。

特定のエンドポイントを公開する 特定のURLを認証不要でアクセスできるように設定できます。以下は、/publicエンドポイントだけ認証不要とする例です。

http
    .authorizeRequests()
        .antMatchers("/public").permitAll() // /publicは認証不要
        .anyRequest().authenticated();

カスタムログインページの指定 デフォルトのログイン画面ではなく、独自のログインページを設定することも可能です。

http
    .formLogin()
        .loginPage("/my-login") // カスタムログインページ
        .permitAll();

ログアウト機能のカスタマイズ ログアウト後のリダイレクト先や、ログアウト処理の動作も設定できます。

http
    .logout()
        .logoutUrl("/logout") // ログアウトURLの指定
        .logoutSuccessUrl("/login?logout"); // ログアウト後のリダイレクト先

@EnableWebSecurityの引数

@EnableWebSecurityそのものには引数はありませんが、セキュリティ設定に関する詳細なオプションをHttpSecurityでカスタマイズできます。また、SecurityFilterChainやカスタム認証マネージャーを利用して、より高度な認証管理や、条件に基づいた認可処理を実装することもできます。


まとめ

@EnableWebSecurityを使うと、Spring Bootアプリケーションでセキュリティ設定をカスタマイズでき、以下のような柔軟なセキュリティ機能を追加できます:

  • エンドポイントごとのアクセス制御
  • フォーム認証やHTTP Basic認証の有効化
  • ユーザー情報のカスタマイズ
  • カスタムログイン・ログアウト設定

まずは@EnableWebSecurityWebSecurityConfigクラスを追加してから、徐々にセキュリティの設定を拡張してみてください。これにより、アプリケーションの安全性が高まり、柔軟なアクセス制御が可能になります!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

タイトルとURLをコピーしました