Hello Spring Security

このセクションでは、Spring Security を Spring Boot で使用するための最小限のセットアップについて説明し、その後の次の手順を示します。

完成したスターターアプリケーションは、サンプルリポジトリ [GitHub] (英語) にあります。利便性のために、Spring Initializr によって準備された最小限の Spring Boot + Spring Security アプリケーションをダウンロードできます。

依存関係の更新

まず、アプリケーションのクラスパスに Spring Security を追加する必要があります。これを行う 2 つの方法は、Maven または Gradle を使用することです。

Hello Spring Security Boot の開始

クラスパスに Spring Security を指定すると、Spring Boot アプリケーションを実行できるようになります。次のスニペットは、アプリケーションで Spring Security が有効になっていることを示す出力の一部を示しています。

Spring Boot アプリケーションの実行
$ ./mvnw spring-boot:run
...
INFO 23689 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration :

Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336

...
$ ./gradlew :bootRun
...
INFO 23689 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration :

Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336

...
$ java -jar target/myapplication-0.0.1.jar
...
INFO 23689 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration :

Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336

...

これで実行できるようになったため、エンドポイントにアクセスして何が起こるかを確認してみてください。次のように資格情報なしでエンドポイントに到達した場合:

セキュア Boot アプリケーションのクエリ
$ curl -i http://localhost:8080/some/path
HTTP/1.1 401
...

その後、Spring Security は 401 Unauthorized でアクセスを拒否します。

ブラウザーに同じ URL を指定すると、デフォルトのログインページにリダイレクトされます。

そして、次のように資格情報 (コンソール出力に表示される) を使用してエンドポイントにアクセスすると、次のようになります。

資格情報を使用したクエリ
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 http://localhost:8080/some/path
HTTP/1.1 404
...

この場合、/some/path が存在しないため、Spring Boot がリクエストを処理し、404 Not Found を返します。

ここから、次のことができます。

ランタイムの期待

Spring Boot と Spring Security のデフォルトの配置により、実行時に次の動作が可能になります。

これを達成するために Spring Boot が Spring Security とどのように連携しているかを理解すると役立ちます。Boot のセキュリティ自動構成 (Javadoc) を見ると、次のことが行われます (説明のために簡略化されています)。

Spring Boot セキュリティ自動構成
@EnableWebSecurity (1)
@Configuration
public class DefaultSecurityConfig {
    @Bean
    @ConditionalOnMissingBean(UserDetailsService.class)
    InMemoryUserDetailsManager inMemoryUserDetailsManager() { (2)
        String generatedPassword = // ...;
        return new InMemoryUserDetailsManager(User.withUsername("user")
                .password(generatedPassword).roles("USER").build());
    }

    @Bean
    @ConditionalOnMissingBean(AuthenticationEventPublisher.class)
    DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) { (3)
        return new DefaultAuthenticationEventPublisher(delegate);
    }
}
  1. @EnableWebSecurity アノテーションを追加します。(特に、これは Spring Security のデフォルト Filter チェーンを @Bean として公開します。)

  2. ユーザー名 user とランダムに生成されたパスワードを使用して UserDetailsService @Bean を発行し、コンソールに記録します。

  3. 認証イベントを発行するための AuthenticationEventPublisher @Bean を発行します

Spring Boot は、@Bean として公開された Filter をアプリケーションのフィルターチェーンに追加します。これは、@EnableWebSecurity を Spring Boot と組み合わせて使用すると、リクエストごとに Spring Security のフィルターチェーンが自動的に登録されることを意味します。

セキュリティの使用例

ここから行きたい場所がたくさんあります。あなたのアプリケーションにとって次に何が起こるかを理解するには、Spring Security が対処するために構築された次の一般的な使用例を考慮してください。

探しているものにどれも一致しない場合は、次の順序でアプリケーションを検討することを検討してください。

  1. プロトコル : まず、アプリケーションが通信に使用するプロトコルを検討します。サーブレットベースのアプリケーションの場合、Spring Security は Web ソケットだけでなく HTTP もサポートします。

  2. 認証 : 次に、ユーザーがどのように認証されるか、その認証がステートフルであるかステートレスであるかを検討します。

  3. 認可 : 次に、ユーザーに何を行う権限が与えられているかをどのように判断するかを検討します。

  4. 防衛 : 最後に、Spring Security のデフォルトの保護機能と統合し必要な追加の保護機能を検討します。