安全性

本節說明使用 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。

在 Proxy 伺服器後方執行時啟用 HTTPS

確保您的所有主要端點僅透過 HTTPS 提供,對於任何應用程式來說都是重要的任務。如果您使用 Tomcat 作為 Servlet 容器,則 Spring Boot 會在偵測到某些環境設定時自動新增 Tomcat 自己的 RemoteIpValve,讓您可以依賴 HttpServletRequest 來報告它是否安全(即使在處理實際 SSL 終止的 Proxy 伺服器下游)。標準行為取決於某些請求標頭(x-forwarded-forx-forwarded-proto)的存在與否,這些標頭的名稱是慣例,因此它應適用於大多數前端 Proxy。您可以透過將一些條目新增至 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 組態為要求所有(或某些)請求的安全通道,請考慮新增您自己的 SecurityFilterChain Bean,以新增下列 HttpSecurity 組態

  • 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()
	}

}