Apache Shiro 安全框架入門系列5-Shiro架構詳解

Shiro架構詳解

— By Solo Cui

Apache Shiro 安全框架入門系列5-Shiro架構詳解

1.概述

Apache Shiro的設計目標是通過直觀且易於使用來簡化應用程序的安全性。Shiro的核心設計模型——也即大多數人對應用安全性思考,就是在相關(某類人或事)背景下與應用的交互。

軟件應用程序通常基於用戶故事而設計。 也就是說,您經常會根據用戶將會(或應該)怎樣與軟件進行交互來設計用戶接口或服務API。 例如,您可能會說:"如果用戶與我的應用程序進行登陸後交互,我會向他們顯示一個按鈕,他們可以點擊查看其帳戶信息。 如果他們沒有登錄,我會顯示一個註冊按鈕。"

此示例語句表明應用程序的編寫主要是為了滿足用戶要求和需要。 即使'用戶'是另一個軟件系統而不是人,但您仍然編寫代碼來反映基於當前與您的軟件進行交互的人(或者什麼)的行為。

Shiro以自己的設計反映了這些概念。 也就是匹配軟件開發人員已經很直觀的東西——Apache Shiro在幾乎任何應用程序中都保持直觀和易用性。

2.高層視圖

在最高的概念層面上,Shiro的架構有三個主要概念:主體,安全管理器和領域。 以下圖表就是這些組件如何交互的高層視圖或高級總覽,下面我們將談論其中的的每個概念:

Apache Shiro 安全框架入門系列5-Shiro架構詳解

•主體(Subject):正如我們在教程中提到的,主體Subject本質上是當前正在執行中的用戶的特定安全"視圖"。 儘管"用戶"一詞通常意味著一個人,但一個主體subject可以是一個人,但也可代表第三方服務、守護進程賬戶,cron作業或類似的任何東西 - 基本上任何當前與該軟件進行交互的任何東西。

主體subject實例都綁定到(並且需要)SecurityManager。 當您與主體Subject進行交互時,這些交互會轉化為與SecurityManager特定主體進行交互。

•安全管理器(SecurityManager):SecurityManager是Shiro體系結構的核心,充當一種"保護傘"對象,協調其內部安全組件,使它們一起形成一個對象圖。 然而一旦為應用程序配置了SecurityManager及其內部對象圖,它通常會獨立存在的,應用程序開發人員幾乎將所有時間都用於Subject API的使用上。

我們稍後將詳細討論SecurityManager,但重要的是要認識到,當您與Subject進行交互時,其實真正的是幕後SecurityManager,它為Subject安全操作做了所有繁重的工作。 這反映在上面的基本流程圖中。

針對許多安全數據源(又名目錄),Shiro提供了開箱即用的Realm連接,如LDAP、關係數據庫(JDBC)、文本配置源(如INI和屬性文件等)。 如果默認的Realms不能滿足您的需求,您可以插入自己的Realm實現來表示自定義數據源。

像其他內部組件一樣,Shiro SecurityManager管理如何使用領域獲取安全和身份數據以表示為主體Subject實例。

3.詳細架構

下圖顯示了Shiro的核心架構概念,然後是每個概念的簡短摘要:

Apache Shiro 安全框架入門系列5-Shiro架構詳解

•主題-Subject(org.apache.shiro.subject.Subject)

當前與軟件交互的實體(用戶,第三方服務,cron作業等)的特定安全"視圖"。

•安全管理器-SecurityManager(org.apache.shiro.mgt.SecurityManager)

如上所述,SecurityManager是Shiro架構的核心。 它主要是一個'保護傘'對象,用於協調其託管組件以確保它們一起順利運行。 它還管理Shiro對每個應用用戶的視圖,因此它知道如何為每個用戶執行安全操作。

•身份驗證器(org.apache.shiro.authc.Authenticator)

Authenticator是負責執行和響應用戶的認證(登錄)嘗試的組件。 當用戶嘗試登錄時,該邏輯由Authenticator執行。 認證器知道如何與存儲相關用戶/賬戶信息的一個或多個領域協調。 從這些領域獲得的數據用於驗證用戶的身份,以確保用戶確實是他們所說的人。

- 身份驗證策略(org.apache.shiro.authc.pam.AuthenticationStrategy)

如果配置了多個Realm,則AuthenticationStrategy將協調Realm以確定認證嘗試成功或失敗的條件(例如,如果一個領域成功但其他失敗,則嘗試成功與否?是否所有領域都必須成功?還是僅需要第一成功即可?)。

•會話管理器(org.apache.shiro.session.mgt.SessionManager)

SessionManager知道如何創建和管理用戶會話生命週期,以便為所有環境中的用戶提供健壯的會話體驗。 這是安全框架世界中的一項獨特功能 - 即使沒有可用的Web/Servlet或EJB容器,Shiro也能夠在任何環境中本地管理用戶會話。 默認情況下,Shiro將使用現有會話機制(如Servlet容器),但如果沒有(例如在獨立應用程序或非Web環境中),它將使用其內置的企業會話管理 提供相同的編程經驗。 SessionDAO的存在允許任何數據源可用於持久化會話。

- SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)

SessionDAO代表SessionManager執行Session持久性(CRUD)操作。 這允許任意數據存儲被插入到會話管理的基礎設施中。

•緩存管理器(org.apache.shiro.cache.CacheManager)

•密碼(org.apache.shiro.crypto.*)

密碼Cryptography是企業安全框架的自然增補。 Shiro的加密軟件包包含易於使用和易於理解的密碼、哈希(又名摘要)和不同編解碼器的實現。 本包中的所有類都經過精心設計,非常易於使用且易於理解。 任何使用Java本地加密支持的人都知道,馴服它可能是一個挑戰性。 Shiro的加密API簡化了複雜的Java機制,使密碼學易於被普通人使用。

•領域(org.apache.shiro.realm.Realm)

提示:安全管理器-SecurityManager

由於Shiro的API鼓勵以主體為中心的編程方法,因此大多數應用程序開發人員很少會直接與SecurityManager進行交互(但是框架開發人員有時可能會發現它很有用)。 即使如此,瞭解SecurityManager的功能仍然很重要,尤其是在為應用程序配置一個功能時。

4.Shrio設計

如前所述,應用程序的SecurityManager執行安全操作併為所有應用程序用戶管理狀態。 在Shiro的默認SecurityManager實現中,包括:

•身份驗證

•會話管理

•高速緩存管理

•領域協調

•事件傳播

•"記住我"服務

•主體創建

•註銷等。

但是這是一個試圖在單個組件中管理的很多功能。 而且,如果所有東西都集中到一個實現類中,要讓這些東西變得靈活和可定製將非常困難。

為了簡化配置並實現靈活的配置/可插拔性,Shiro的實現在設計中都是高度模塊化的——實際上就是模塊,而SecurityManager實現(及其類層次結構)實際上並沒有做很多。 相反,SecurityManager實現主要作為一個輕量級的"容器"組件,將幾乎所有行為委託給嵌套/包裝組件。 這個'包裝'設計反映在上面的詳細架構圖中。

當組件實際執行邏輯時,SecurityManager實現知道如何以及何時協調組件的正確行為。

SecurityManager實現和組件也是JavaBeans兼容的,這允許您(或配置機制)通過標準JavaBeans訪問器/增量器方法(即get*/set*方法)輕鬆定製可插入組件。 這意味著Shiro的架構模塊化可以為定製行為轉化成非常簡單的配置。

提示:易配置

由於JavaBeans兼容性,通過支持JavaBeans風格配置的任何機制(例如Spring,Guice,JBoss等),可以很容易地通過自定義組件來配置SecurityManager。

結語



分享到:


相關文章: