你好 Spring Security

本節介紹瞭如何將 Spring Security 與 Spring Boot 一起使用的最低配置,並指出了後續步驟。

完整的入門應用可在我們的示例倉庫中找到。為了方便起見,您可以從Spring Initializr下載一個最小化的 Spring Boot + Spring Security 應用。

更新依賴

您首先需要將 Spring Security 新增到您的應用程式的 classpath 中;有兩種方法可以做到:使用 Maven使用 Gradle

啟動 你好 Spring Security Boot 應用

將 Spring Security 新增到 classpath 後,您現在可以執行 Spring Boot 應用。以下片段顯示了部分輸出,表明您的應用中已啟用 Spring Security

執行 Spring Boot 應用
  • 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

...

現在它已經執行起來了,您可以嘗試訪問一個端點,看看會發生什麼。如果您在沒有憑據的情況下訪問一個端點,像這樣

查詢一個受保護的 Boot 應用
$ 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 的預設配置在執行時提供了以下行為

瞭解 Spring Boot 如何與 Spring Security 協同工作以實現這些功能會很有幫助。檢視Boot 的安全自動配置,它會執行以下操作(為便於說明而簡化)

Spring 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);
    }
}
  1. 新增 @EnableWebSecurity 註解。(除其他功能外,這會將Spring Security 的預設 Filter釋出為一個 @Bean

  2. 釋出一個 UserDetailsService @Bean,其使用者名稱為 user,並生成一個記錄到控制檯的隨機密碼

  3. 釋出一個 AuthenticationEventPublisher @Bean,用於釋出認證事件

Spring Boot 會將任何作為 @Bean 釋出的 Filter 新增到應用程式的過濾器鏈中。這意味著結合使用 @EnableWebSecurity 和 Spring Boot 會自動為每個請求註冊 Spring Security 的過濾器鏈。

安全用例

接下來您可能會想了解許多方面。要弄清楚您和您的應用程式接下來要做什麼,請考慮 Spring Security 旨在解決的這些常見用例

如果以上用例都不符合您的需求,請考慮按以下順序思考您的應用程式

  1. 協議:首先,考慮您的應用程式將使用哪種協議進行通訊。對於基於 Servlet 的應用程式,Spring Security 支援 HTTP 和 Websockets

  2. 認證:接下來,考慮使用者將如何認證,以及認證是帶狀態的還是無狀態的

  3. 授權:然後,考慮如何確定使用者被授權執行哪些操作

  4. 防禦:最後,整合 Spring Security 的預設保護措施,並考慮您需要哪些額外的保護措施