安全
本節解答在使用 Spring Boot 工作時有關安全性的問題,包括在使用 Spring Security 和 Spring Boot 時出現的問題。
有關 Spring Security 的更多資訊,請參閱 Spring Security 專案頁面。
關閉 Spring Boot 安全配置
如果你在應用程式中定義了一個帶有 SecurityFilterChain
bean 的 @Configuration
,此操作會關閉 Spring Boot 中預設的 webapp 安全設定。
更改 UserDetailsService 並新增使用者賬號
如果你提供一個 @Bean
型別為 AuthenticationManager
、AuthenticationProvider
或 UserDetailsService
,則不會建立預設的 @Bean
for InMemoryUserDetailsManager
。這意味著你可以使用 Spring Security 的全部功能集(例如各種認證選項)。
新增使用者賬號最簡單的方法是提供你自己的 UserDetailsService
bean。
在代理伺服器後執行啟用 HTTPS
確保所有主要端點僅透過 HTTPS 可用是任何應用程式的重要任務。如果你使用 Tomcat 作為 Servlet 容器,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 要求所有(或部分)請求使用安全通道,請考慮新增你自己的 SecurityFilterChain
bean,該 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()
}
}