Spring Security 簡介
本節介紹如何使用 Spring Security 與 Spring Boot 的基本設定,並引導您進行後續步驟。
完整的入門應用程式可以在我們的範例儲存庫中找到。為了您的方便,您可以下載由 Spring Initializr 準備的最小 Spring Boot + Spring Security 應用程式。 |
啟動 Spring Security Boot 簡介
在 classpath 中加入 Spring Security 後,您現在可以執行 Spring Boot 應用程式。以下程式碼片段顯示了一些輸出,表明 Spring Security 已在您的應用程式中啟用
-
Maven
-
Gradle
-
Jar
$ ./mvnw spring-boot:run
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
$ ./gradlew :bootRun
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
$ java -jar target/myapplication-0.0.1.jar
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
現在您已經執行了它,您可以嘗試訪問一個端點看看會發生什麼。如果您在沒有憑證的情況下訪問端點,如下所示
$ curl -i https://127.0.0.1:8080/some/path
HTTP/1.1 401
...
則 Spring Security 會拒絕存取,並返回 401 Unauthorized
。
如果您在瀏覽器中提供相同的 URL,它將重新導向到預設登入頁面。 |
如果您使用憑證(在主控台輸出中找到)訪問端點,如下所示
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 https://127.0.0.1:8080/some/path
HTTP/1.1 404
...
則 Spring Boot 將處理請求,但在這種情況下會返回 404 Not Found
,因為 /some/path
不存在。
從這裡開始,您可以
執行時期預期
Spring Boot 和 Spring Security 的預設配置在執行時期提供以下行為
-
任何端點(包括 Boot 的
/error
端點)都需要已驗證的使用者 -
在啟動時註冊一個預設使用者,並產生一個密碼(密碼會記錄到主控台;在前面的範例中,密碼是
8e557245-73e2-4286-969a-ff57fe326336
) -
使用 BCrypt 以及其他方式保護密碼儲存
-
驗證基於表單的 登入 以及 HTTP Basic
-
提供內容協商;對於 Web 請求,重新導向到登入頁面;對於服務請求,返回
401 Unauthorized
-
緩解 CSRF 攻擊
-
緩解 Session Fixation 攻擊
-
寫入保護已驗證資源的 Cache Control 標頭
-
寫入 X-Frame-Options 以緩解 Clickjacking
-
發布 身份驗證成功和失敗事件
了解 Spring Boot 如何與 Spring Security 協調以實現此目的可能會有所幫助。查看 Boot 的安全性自動設定,它會執行以下操作(為簡化說明)
@EnableWebSecurity (1)
@Configuration
public class DefaultSecurityConfig {
@Bean
@ConditionalOnMissingBean(UserDetailsService.class)
InMemoryUserDetailsManager inMemoryUserDetailsManager() { (2)
String generatedPassword = // ...;
return new InMemoryUserDetailsManager(User.withUsername("user")
.password(generatedPassword).roles("USER").build());
}
@Bean
@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) { (3)
return new DefaultAuthenticationEventPublisher(delegate);
}
}
-
新增
@EnableWebSecurity
註解。(除此之外,這會將 Spring Security 的預設Filter
鏈發布為@Bean
) -
發布一個
UserDetailsService
@Bean
,使用者名稱為user
,並產生一個隨機密碼記錄到主控台 -
發布一個
AuthenticationEventPublisher
@Bean
用於發布身份驗證事件
Spring Boot 將任何發布為 @Bean 的 Filter 新增到應用程式的 filter 鏈中。這表示結合 Spring Boot 使用 @EnableWebSecurity 會自動為每個請求註冊 Spring Security 的 filter 鏈。 |
安全性使用案例
從這裡開始,您可能想要前往許多地方。為了找出您和您的應用程式接下來的步驟,請考慮 Spring Security 旨在解決的這些常見使用案例
-
我正在建構 REST API,並且需要驗證 JWT 或 其他 bearer 令牌
-
我正在建構 Web 應用程式、API 閘道或 BFF,並且
-
我需要管理
-
LDAP 或 Active Directory 中的使用者,使用 Spring Data,或使用 JDBC
-
如果以上皆非您要尋找的,請考慮按以下順序思考您的應用程式
-
協定:首先,考慮您的應用程式將用於通訊的協定。對於基於 servlet 的應用程式,Spring Security 支援 HTTP 以及 Websocket。
-
身份驗證:接下來,考慮使用者將如何進行身份驗證,以及該身份驗證是否將是有狀態或無狀態的
-
授權:然後,考慮您將如何決定使用者被授權執行哪些操作
-
防禦:最後,與 Spring Security 的預設保護整合,並考慮您需要哪些額外保護