Spring Security 簡介

本節介紹如何使用 Spring Security 與 Spring Boot 的基本設定,並引導您進行後續步驟。

完整的入門應用程式可以在我們的範例儲存庫中找到。為了您的方便,您可以下載由 Spring Initializr 準備的最小 Spring Boot + Spring Security 應用程式

更新相依性

您首先需要將 Spring Security 新增到應用程式的 classpath 中;兩種方法是使用 MavenGradle

啟動 Spring Security Boot 簡介

classpath 中加入 Spring Security 後,您現在可以執行 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://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 的預設配置在執行時期提供以下行為

了解 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 將任何發布為 @BeanFilter 新增到應用程式的 filter 鏈中。這表示結合 Spring Boot 使用 @EnableWebSecurity 會自動為每個請求註冊 Spring Security 的 filter 鏈。

安全性使用案例

從這裡開始,您可能想要前往許多地方。為了找出您和您的應用程式接下來的步驟,請考慮 Spring Security 旨在解決的這些常見使用案例

如果以上皆非您要尋找的,請考慮按以下順序思考您的應用程式

  1. 協定:首先,考慮您的應用程式將用於通訊的協定。對於基於 servlet 的應用程式,Spring Security 支援 HTTP 以及 Websocket

  2. 身份驗證:接下來,考慮使用者將如何進行身份驗證,以及該身份驗證是否將是有狀態或無狀態的

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

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