你好 Spring Security
本節介紹瞭如何將 Spring Security 與 Spring Boot 一起使用的最低配置,並指出了後續步驟。
完整的入門應用可在我們的示例倉庫中找到。為了方便起見,您可以從Spring Initializr下載一個最小化的 Spring Boot + Spring Security 應用。 |
啟動 你好 Spring Security Boot 應用
將 Spring Security 新增到 classpath 後,您現在可以執行 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://:8080/some/path
HTTP/1.1 401
...
那麼 Spring Security 會拒絕訪問,並返回 401 Unauthorized
。
如果您在瀏覽器中提供相同的 URL,它將重定向到預設的登入頁面。 |
如果您使用憑據(在控制檯輸出中找到)訪問一個端點,如下所示
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 https://: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 攻擊
-
寫入 X-Content-Type-Options 以緩解嗅探攻擊
-
寫入 Cache Control 頭,用於保護已認證資源
瞭解 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 新增到應用程式的過濾器鏈中。這意味著結合使用 @EnableWebSecurity 和 Spring Boot 會自動為每個請求註冊 Spring Security 的過濾器鏈。 |
安全用例
接下來您可能會想了解許多方面。要弄清楚您和您的應用程式接下來要做什麼,請考慮 Spring Security 旨在解決的這些常見用例
-
我正在構建一個 REST API,並且需要認證一個 JWT 或其他 Bearer 令牌
-
我正在構建一個 Web 應用、API 閘道器或 BFF,並且
-
我需要管理
-
LDAP 或 Active Directory 中的使用者,使用 Spring Data,或使用 JDBC
-
如果以上用例都不符合您的需求,請考慮按以下順序思考您的應用程式
-
協議:首先,考慮您的應用程式將使用哪種協議進行通訊。對於基於 Servlet 的應用程式,Spring Security 支援 HTTP 和 Websockets。
-
認證:接下來,考慮使用者將如何認證,以及認證是帶狀態的還是無狀態的
-
授權:然後,考慮如何確定使用者被授權執行哪些操作
-
防禦:最後,整合 Spring Security 的預設保護措施,並考慮您需要哪些額外的保護措施