Apache Shiro架構設計

Apache Shiro的設計目標是通過直觀和易用來簡化應用程序安全性。Shiro的核心設計模擬了大多數人對應用程序安全性的看法 - 在某人(或某事)與應用程序交互的環境中。

軟件應用程序通常基於用戶故事設計。也就是說,您通常會根據用戶(或應該)與軟件交互的方式設計用戶界面或服務API。例如,您可能會說,“如果用戶與我的應用程序交互,則會向他們顯示一個按鈕,他們可以單擊該按鈕查看其帳戶信息。如果他們沒有登錄,我會顯示一個註冊按鈕。

主要概念

Shiro的架構有3個主要概念:和Subject,SecurityManager和Realms。


Apache Shiro架構設計



  • 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的核心架構概念


Apache 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實現知道如何以及何時協調組件以獲得正確的行為。


分享到:


相關文章: