博客 / 詳情

返回

什麼時候需要用到 @EnableWebSecurity 註解?

有小夥伴在學習 Spring Security 的遇到一個問題:

箭頭所指的位置報紅,也就是 Spring 容器中沒有找到一個類型為 HttpSecurity 的 Bean。

小夥伴説如果他在配置類上加 @EnableWebSecurity 註解,就不報錯;不加該註解則會報錯。那麼到底該不該加 @EnableWebSecurity 註解呢?今天就來和大夥聊一聊這個話題。

一 @EnableWebSecurity

首先我們來説下 @EnableWebSecurity 這個註解。從名字上就能看出來,這個註解就是啓動 Spring Security 的,我們來看下這個註解的定義:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class,
        HttpSecurityConfiguration.class })
@EnableGlobalAuthentication
public @interface EnableWebSecurity {

    /**
     * Controls debugging support for Spring Security. Default is false.
     * @return if true, enables debug support with Spring Security
     */
    boolean debug() default false;

}

小夥伴們看到,這個註解的核心能力有兩方面:

  1. 導入了四個配置類。
  2. 啓用了 @EnableGlobalAuthentication 註解。

我們先來看這四個配置類。

1.1 WebSecurityConfiguration

WebSecurityConfiguration 是 Spring Security 框架中的一個核心配置類,它的主要作用是自動配置 Web 安全相關的組件和服務,以確保應用程序的 Web 層安全。

WebSecurityConfiguration 主要有如下一些作用:

  1. 初始化 WebSecurity:它創建並配置了 WebSecurity 對象,這是一個高級抽象,負責配置安全過濾器鏈(FilterChainProxy),該過濾器鏈處理所有進入的 HTTP 請求,執行認證、授權、安全頭設置、CSRF 保護等安全操作。
  2. 自動配置 SecurityFilterChain:通過 WebSecurityWebSecurityConfiguration 會設置一系列的安全過濾器,這些過濾器形成了 SecurityFilterChain,負責處理所有 Web 請求的安全性。
  3. 配置默認安全行為:它提供了默認的安全配置,如允許未認證訪問靜態資源、設置默認的登錄表單和登出邏輯、異常處理等,這些都是大多數 Web 應用的基礎安全需求。
  4. 支持自定義配置:儘管提供了默認配置,WebSecurityConfiguration 也允許開發者通過擴展 WebSecurityConfigurerAdapter(Spring Security5.7及以後版本已被棄用)或直接實現相關接口來自定義安全策略,以滿足特定應用的需求。開發者可以覆蓋默認的認證、授權規則、安全過濾器等配置。

從這裏大家可以看到,WebSecurityConfiguration 是 Spring Security 自動配置的核心,它簡化了安全配置過程,同時保持了高度的可定製性,是構建安全 Web 應用不可或缺的一部分。

1.2 SpringWebMvcImportSelector

SpringWebMvcImportSelector 主要是判斷當前是不是 Web 環境,如果是,則返回 WebMvcSecurityConfiguration 對象進行配置,WebMvcSecurityConfiguration 在最新版 Spring Security 中已經廢棄了。

1.3 OAuth2ImportSelector

OAuth2ImportSelector 主要是檢查當前項目有沒有使用 OAuth2 Client,如果使用了,則返回和 OAuth2 Client 相關的配置類完成自動配置。

1.4 HttpSecurityConfiguration

HttpSecurityConfiguration 是提供了默認的 HttpSecurity 對象,關於 HttpSecurity 對象鬆哥在前面的文章中已經詳細介紹過了。HttpSecurity 是如何組裝過濾器鏈的。

1.5 @EnableGlobalAuthentication

這個註解主要是為了導入 AuthenticationConfiguration 配置,AuthenticationConfiguration 配置中主要是配置了一些全局的認證器,因為 Spring Security 中的認證器有全局和局部之分(感興趣的小夥伴可以瞭解下鬆哥的Spring Security6+OAuth2 視頻精講)。

從上面的代碼中我們可以看到,@EnableWebSecurity 註解存在的意義,主要是就是開啓了 Spring Security 的一些默認配置,相當於是一件啓用 Spring Security。

二 加還是不加?

一鍵啓用 Spring Security,在沒有 Spring Boot 的年代,這確實是個好玩意!

但是!!!

現在我們都是使用 Spring Boot,相信各位小夥伴使用 Spring Security 的場景基本上也都是在 Spring Boot 項目中,而 Spring Boot 中關於 Spring Security 提供了自動化配置類 SecurityAutoConfiguration,當我們分析 SecurityAutoConfiguration 的源碼時候,發現其實它裏邊最終也是調用了 @EnableWebSecurity。

所以,在 Spring Boot 項目中使用 Spring Security 的話,一般是不需要自己手動添加 @EnableWebSecurity 註解的,默認的自動化配置類已經幫我們啓用了該註解。

三 問題答案

回到一開始的問題。小夥伴遇到這種問題,一般是兩種可能:

  1. IDEA 檢測問題,IDEA 提示不能全信,對於這樣的報錯問題,如果確認自己代碼沒問題,那就大膽去運行,可能是 IDEA 誤報。
  2. 當前配置類沒有被 Spring 容器掃描到,即當前配置類不在 Spring 容器中,但是卻嘗試注入 Spring 容器中的 Bean,於是就有了錯誤提示。當添加了 @EnableWebSecurity 註解之後,IDEA 檢測到有 HttpSecurity 對象導入了,就不報錯了,但是問題在根源其實在於當前類沒有被注入到 Spring 容器中。

後來證明是第二種原因。

歡迎各位小夥伴一起來精進 Spring Security~

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.