Spring Security - 架構



Spring Security 是 Spring 專案或模組之一,用於保護基於 Spring 的應用程式。Spring Security 為我們提供了許多內建功能來在我們的應用程式中實現身份驗證和授權。我們可以使用這些功能並進行修改,從而快速保護應用程式。除此之外,Spring Security 還允許對之前提到的功能進行大量自定義,以實現我們自己的複雜身份驗證和授權。

Spring Security 架構

Spring Security 架構從 Servlet 過濾器開始。這些過濾器攔截請求,對請求執行操作,然後將請求傳遞給過濾器鏈中的下一個過濾器或請求處理程式,或者如果請求不滿足某些條件則阻止請求。正是在此過程中,Spring Security 可以對請求進行身份驗證並在請求上執行各種身份驗證檢查。它還可以透過不允許未經身份驗證或惡意請求透過來阻止它們訪問受保護的資源,從而保護我們的應用程式和資源。因此,我們的應用程式和資源保持受保護。

Components of Spring Security Architecture

Spring Security 架構的元件

如上圖所示,Spring Security 的基本元件如下所示。在後續內容中,我們將簡要討論它們。我們還將討論它們在身份驗證和授權過程中的作用。

如上圖所示,Spring Security 的基本元件如下所示。在後續內容中,我們將簡要討論它們。我們還將討論它們在身份驗證和授權過程中的作用。

AuthenticationFilter

這是攔截請求並嘗試對其進行身份驗證的過濾器。在 Spring Security 中,它將請求轉換為 Authentication 物件,並將身份驗證委託給 AuthenticationManager。

AuthenticationManager

它是身份驗證的主要策略介面。它使用唯一的 authenticate() 方法來對請求進行身份驗證。authenticate() 方法執行身份驗證,並在身份驗證成功時返回 Authentication 物件,或者在身份驗證失敗時丟擲 AuthenticationException。如果該方法無法決定,則將返回 null。在此過程中,身份驗證過程委託給 AuthenticationProvider,我們將在後面討論。

AuthenticationProvider

ProviderManager 實現 AuthenticationManager,並將過程委託給一個或多個 AuthenticationProvider 例項。任何實現 AuthenticationProvider 介面的類都必須實現兩個方法——authenticate() 和 supports()。首先,讓我們討論 supports() 方法。它用於檢查我們的 AuthenticationProvider 實現類是否支援特定的身份驗證型別。如果支援則返回 true,否則返回 false。接下來是 authenticate() 方法。這是發生身份驗證的地方。如果支援身份驗證型別,則啟動身份驗證過程。在此類中,可以使用 **UserDetailsService** 實現的 loadUserByUsername() 方法。如果找不到使用者,則可以丟擲 UsernameNotFoundException。

另一方面,如果找到使用者,則使用使用者的身份驗證詳細資訊來對使用者進行身份驗證。例如,在基本身份驗證方案中,使用者提供的密碼可能會與資料庫中的密碼進行檢查。如果發現它們彼此匹配,則表示成功。然後,我們可以從此方法返回一個 Authentication 物件,該物件將儲存在 Security Context 中,我們將在後面討論。

UserDetailsService

它是 Spring Security 的核心介面之一。任何請求的身份驗證大多取決於 UserDetailsService 介面的實現。它最常用於資料庫支援的身份驗證以檢索使用者資料。資料是透過實現唯一的 loadUserByUsername() 方法檢索的,我們可以在其中提供我們的邏輯來獲取使用者的使用者詳細資訊。如果未找到使用者,該方法將丟擲 UsernameNotFoundException。

PasswordEncoder

在 Spring Security 4 之前,PasswordEncoder 的使用是可選的。使用者可以使用記憶體中身份驗證儲存純文字密碼。但是 Spring Security 5 已強制使用 PasswordEncoder 來儲存密碼。它使用其眾多實現之一對使用者的密碼進行編碼。其最常見的實現是 BCryptPasswordEncoder。此外,我們可以將 NoOpPasswordEncoder 的例項用於開發目的。它將允許密碼以純文字形式儲存。但它不應用於生產或真實世界的應用程式。

Spring Security Context

這是在身份驗證成功後儲存當前已認證使用者詳細資訊的地方。然後,身份驗證物件在整個會話期間對應用程式可用。因此,如果我們需要使用者名稱或任何其他使用者詳細資訊,我們需要先獲取 SecurityContext。這是透過 SecurityContextHolder 完成的,SecurityContextHolder 是一個輔助類,提供對安全上下文的訪問。我們可以分別使用 setAuthentication() 和 getAuthentication() 方法來儲存和檢索使用者詳細資訊。

接下來,讓我們討論一下我們將用於應用程式的三個自定義實現。

表單登入

當我們將 Spring Security 新增到現有的 Spring 應用程式時,它會新增一個登入表單並設定一個虛擬使用者。這是 Spring Security 的自動配置模式。在此模式下,它還設定了預設過濾器、身份驗證管理器、身份驗證提供程式等。此設定是記憶體中身份驗證設定。我們可以覆蓋此自動配置以設定我們自己的使用者和身份驗證過程。我們還可以設定自定義登入方法,例如自定義登入表單。Spring Security 只需要瞭解登入表單的詳細資訊,例如登入表單的 URI、登入處理 URL 等。然後,它將為應用程式呈現我們的登入表單,並執行身份驗證過程以及其他提供的配置或 Spring 自己的實現。

自定義表單設定只需要遵守某些規則才能與 Spring Security 整合。我們需要有一個使用者名稱引數和一個密碼引數,並且引數名稱應為“username”和“password”,因為這些是預設名稱。如果我們在自定義中使用我們自己的引數名稱來表示這些欄位,則必須使用 usernameParameter() 和 passwordParameter() 方法通知 Spring Security 這些更改。類似地,對於我們對登入表單或表單登入方法所做的每個更改,我們都必須使用適當的方法通知 Spring Security 這些更改,以便它可以將它們與身份驗證過程整合。

廣告