安全性
本節說明使用 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。
在 Proxy 伺服器後方執行時啟用 HTTPS
確保您的所有主要端點僅透過 HTTPS 提供,對於任何應用程式來說都是重要的任務。如果您使用 Tomcat 作為 Servlet 容器,則 Spring Boot 會在偵測到某些環境設定時自動新增 Tomcat 自己的 RemoteIpValve
,讓您可以依賴 HttpServletRequest
來報告它是否安全(即使在處理實際 SSL 終止的 Proxy 伺服器下游)。標準行為取決於某些請求標頭(x-forwarded-for
和 x-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()
}
}