@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
は誰でもアクセス可能/admin
はADMIN
ロールを持つユーザーのみアクセス可能- その他のエンドポイントは、認証が必要です。
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認証の有効化
- ユーザー情報のカスタマイズ
- カスタムログイン・ログアウト設定
まずは@EnableWebSecurity
とWebSecurityConfig
クラスを追加してから、徐々にセキュリティの設定を拡張してみてください。これにより、アプリケーションの安全性が高まり、柔軟なアクセス制御が可能になります!
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓