セキュリティ

このセクションでは、Spring Boot で Spring Security を使用することから生じる質問を含む、Spring Boot を使用する際のセキュリティに関する質問について説明します。

Spring Security の詳細については、Spring Security プロジェクトページを参照してください。

Spring Boot のセキュリティ設定をオフにする

アプリケーションで SecurityFilterChain Bean を使用して @Configuration を定義すると、このアクションにより Spring Boot のデフォルトの Web アプリセキュリティ設定がオフになります。

UserDetailsService の変更とユーザーアカウントの追加

型 AuthenticationManagerAuthenticationProviderUserDetailsService の @Bean を指定した場合、InMemoryUserDetailsManager のデフォルトの @Bean は作成されません。これは、Spring Security の完全な機能セット(さまざまな認証オプションなど)を利用できることを意味します。

ユーザーアカウントを追加する最も簡単な方法は、独自の UserDetailsService Bean を提供することです。

プロキシサーバーの背後で実行しているときに HTTPS を有効にする

すべてのメインエンドポイントが HTTPS 経由でのみ利用できるようにすることは、どのアプリケーションにとっても重要な作業です。Tomcat をサーブレットコンテナーとして使用する場合、Spring Boot は何らかの環境設定を検出すると Tomcat 独自の RemoteIpValve を自動的に追加します。これにより、HttpServletRequest を利用して安全かどうかを報告できます (実際の SSL を処理するプロキシサーバーのダウンストリームであっても) 終了)。標準の動作は、特定のリクエストヘッダー (x-forwarded-for および x-forwarded-proto) の有無によって決まります。その名前は従来のものであるため、ほとんどのフロントエンドプロキシで動作するはずです。次の例に示すように、いくつかのエントリを application.properties に追加することで、バルブをオンにできます。

  • プロパティ

  • YAML

server.tomcat.remoteip.remote-ip-header=x-forwarded-for
server.tomcat.remoteip.protocol-header=x-forwarded-proto
server:
  tomcat:
    remoteip:
      remote-ip-header: "x-forwarded-for"
      protocol-header: "x-forwarded-proto"

(これらのプロパティのいずれかが存在すると、バルブが切り替わります。または、WebServerFactoryCustomizer Bean を使用して TomcatServletWebServerFactory をカスタマイズすることにより、RemoteIpValve を追加できます)

すべて(または一部)のリクエストにセキュリティで保護されたチャネルをリクエストするように Spring Security を構成するには、次の HttpSecurity 構成を追加する独自の SecurityFilterChain Bean を追加することを検討してください。

  • Java

  • Kotlin

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.web.SecurityFilterChain;

@Configuration
public class MySecurityConfig {

	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		// Customize the application security ...
		http.requiresChannel((channel) -> channel.anyRequest().requiresSecure());
		return http.build();
	}

}
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.web.SecurityFilterChain

@Configuration
class MySecurityConfig {

	@Bean
	fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
		// Customize the application security ...
		http.requiresChannel { requests -> requests.anyRequest().requiresSecure() }
		return http.build()
	}

}