Apache Shiro的設計目標是通過直觀和易用來簡化應用程序安全性。Shiro的核心設計模擬了大多數人對應用程序安全性的看法 - 在某人(或某事)與應用程序交互的環境中。
軟件應用程序通常基於用戶故事設計。也就是說,您通常會根據用戶(或應該)與軟件交互的方式設計用戶界面或服務API。例如,您可能會說,“如果用戶與我的應用程序交互,則會向他們顯示一個按鈕,他們可以單擊該按鈕查看其帳戶信息。如果他們沒有登錄,我會顯示一個註冊按鈕。
主要概念
Shiro的架構有3個主要概念:和Subject,SecurityManager和Realms。
- Subject:正如我們在教程中提到的,Subject它本質上是當前正在執行的用戶的特定於安全性的“視圖”。雖然“用戶”這個詞通常意味著一個Subject人,但是它可以是一個人,但它也可以代表第三方服務,守護進程帳戶,cron作業或任何類似的東西 - 基本上任何與軟件交互的東西。
- Subject實例都被綁定(並要求)a SecurityManager。當您與a進行交互時Subject,這些交互會轉換為特定於主題的交互SecurityManager。
- SecurityManager:它SecurityManager是Shiro架構的核心,充當一種“傘形”對象,協調其內部安全組件,共同形成一個對象圖。但是,一旦為應用程序配置了SecurityManager及其內部對象圖,通常會將其保留,應用程序開發人員幾乎將所有時間花在SubjectAPI上。
- 我們稍後將SecurityManager詳細討論,但重要的是要意識到,當您與a進行交互時Subject,實際上是SecurityManager幕後操作可以完成所有Subject安全操作。這反映在上面的基本流程圖中。
- Realm:Realm充當Shiro與應用程序安全數據之間的“橋樑”或“連接器”。當實際與安全相關數據(如用戶帳戶)進行交互以執行身份驗證(登錄)和授權(訪問控制)時,Shiro會從為應用程序配置的一個或多個Realm中查找許多這些內容。
- 從這個意義上講,Realm本質上是一個特定於安全性的DAO:它封裝了數據源的連接細節,並根據需要使相關數據可用於Shiro。配置Shiro時,必須至少指定一個Realm用於身份驗證和/或授權。綜上所述SecurityManager可以配置多個Realms,但至少有一個是必需的。
- Shiro提供了開箱即用的Realms,可以連接到許多安全數據源(也稱為目錄),如LDAP,關係數據庫(JDBC),文本配置源(如INI和屬性文件等)。如果默認域不符合您的需要,您可以插入自己的Realm實現來表示自定義數據源。
- 與其他內部組件一樣,Shiro SecurityManager管理如何使用Realms獲取要表示為Subject實例的安全性和身份數據。
- 詳細架構
下圖顯示了Shiro的核心架構概念
- Subject(org.apache.shiro.subject.Subject)
- 當前與軟件交互的實體(用戶,第三方服務,cron作業等)的特定於安全性的“視圖”。
- SecurityManager(org.apache.shiro.mgt.SecurityManager)
- 如上所述,這SecurityManager是Shiro建築的核心。它主要是一個“傘形”對象,協調其託管組件,以確保它們一起平穩運行。它還管理Shiro對每個應用程序用戶的視圖,因此它知道如何對每個用戶執行安全操作。
- Authenticator(org.apache.shiro.authc.Authenticator)
- Authenticator是負責執行和反應以驗證(註冊)用戶企圖的組件。當用戶嘗試登錄時,該邏輯由執行Authenticator。該Authenticator知道如何與一個或多個協調Realms存儲有關用戶/帳戶信息。從這些數據中獲取的數據Realms用於驗證用戶的身份,以保證用戶確實是他們所說的人。
- AuthenticationStrategy(org.apache.shiro.authc.pam.AuthenticationStrategy)
- 如果Realm配置了多個,AuthenticationStrategy則將協調Realms以確定身份驗證嘗試成功或失敗的條件,比如說是否多個成功才算成功認證,或者一個成功認證計算成功。
- Authorizer(org.apache.shiro.authz.Authorizer)
- Authorizer是負責確定用戶在該應用程序的訪問控制。這種機制最終會說明是否允許用戶做某事。與此類似Authenticator,它Authorizer也知道如何協調多個後端數據源以訪問角色和權限信息。在Authorizer使用該信息來確定到底是否允許用戶執行特定的操作。
- SessionManager(org.apache.shiro.session.mgt.SessionManager)
- 將SessionManager知道如何創建和管理用戶Session生命週期,提供在所有環境中的用戶強大的會話體驗。這是安全框架領域的一項獨特功能 - 即使沒有可用的Web / Servlet或EJB容器,Shiro也能夠在任何環境中管理用戶Sessions。默認情況下,Shiro將使用現有的會話機制(例如Servlet容器),但如果沒有,例如在獨立應用程序或非Web環境中,SessionDAO存在允許任何數據源被用來使用的會話。
- SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
- SessionDAO執行Session代表的持久性(CRUD)操作。這允許將任何數據存儲插入會話管理基礎結構。
- CacheManager的(org.apache.shiro.cache.CacheManager)
- CacheManager創建和管理Cache其他四個組件使用實例的生命週期。由於Shiro可以訪問許多後端數據源以進行身份驗證,授權和會話管理,因此緩存一直是框架中的一流架構功能,可在使用這些數據源時提高性能。任何現代開源和/或企業緩存產品都可以插入Shiro,以提供快速有效的用戶體驗。
- Cryptography (org.apache.shiro.crypto.Cryptography)
- 密碼學是企業安全框架的自然補充。Shiro的crypto軟件包包含易於使用和理解的加密密碼,哈希和不同編解碼器實現的表示。該軟件包中的所有類都經過精心設計,易於使用且易於理解。使用Java本機加密支持的任何人都知道它可能是一個具有挑戰性的。Shiro的加密API簡化了複雜的Java機制,使密碼學易於用於普通人。
- Realm(org.apache.shiro.realm.Realm)
- 如上所述,Realms充當Shiro與應用程序安全數據之間的“橋接”或“連接器”。當實際與安全相關數據(如用戶帳戶)進行交互以執行身份驗證(登錄)和授權(訪問控制)時,Shiro會從為應用程序配置的一個或多個領域中查找許多這些內容。您可以根據Realms需要配置任意數量(通常每個數據源一個),Shiro將根據需要進行身份驗證和授權協調。
總結
如前所述,應用程序SecurityManager執行安全操作並管理所有應用程序用戶的狀態。在Shiro的默認SecurityManager實現中,這包括:
- 認證
- 授權
- 會話管理
- 緩存管理
- Realm協調
- 事件傳播
- “記住我”服務
- Subject創作
- 退出等等。
但是,這是嘗試在單個組件中管理的許多功能。而且,如果將所有內容集中到單個實現類中,那麼使這些內容變得靈活且可自定義將非常困難。
為了簡化配置並實現靈活的配置/可插拔性,Shiro的實現都是高度模塊化的設計 - 實際上是模塊化的,SecurityManager實現(及其類層次結構)根本不起作用。相反,這些SecurityManager實現主要充當輕量級“容器”組件,幾乎將所有行為委託給嵌套/包裝組件。這種“包裝”設計反映在上面的詳細架構圖中。
當組件實際執行邏輯時,SecurityManager實現知道如何以及何時協調組件以獲得正確的行為。
閱讀更多 蝸牛與小羊 的文章