セキュリティ
このセクションでは、Spring Boot で Spring Security を使用することから生じる質問を含む、Spring Boot を使用する際のセキュリティに関する質問について説明します。
Spring Security の詳細については、Spring Security プロジェクトページを参照してください。
Spring Boot のセキュリティ設定をオフにする
アプリケーションで SecurityFilterChain
Bean を使用して @Configuration
を定義すると、このアクションにより Spring Boot のデフォルトの Web アプリセキュリティ設定がオフになります。
UserDetailsService の変更とユーザーアカウントの追加
型 AuthenticationManager
、AuthenticationProvider
、UserDetailsService
の @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()
}
}