Apache Shiro系列教程之三:Shiro的結構,apacheshiro
Shiro的設計目標是簡化應用的安全管理工作。軟件通常是以用戶為基礎設計的。也就是說,我們經常是根據用戶是怎樣和我們的軟件交互的來設計相關的用戶接口。比如,你可能會說“如果是已經登錄的用戶與我的軟件交互,那麼我給他就顯示一個按鈕,讓他點擊後可以查看自己的賬戶信息。如果用戶沒有登錄,那麼我就顯示一個注冊按鈕”。
這個例子說明了我們軟件中很多代碼都是為了滿足用戶需求而寫。即使“用戶”有時候壓根就不是一個人(比如說另一個軟件系統)。
Shiro的設計反映了這些思想,這樣使得開發者更加容易理解Shiro中的一些概念,也使得Shiro更加易用。
一、概覽Shiro結構
從高層次來看,Shiro的結構中有三個主要的概念:Subject、SecurityManager和Realms。下圖展示了這些組件是如何交互的:
- Subject:指當前正在執行程序的“用戶”。Subject含義更廣,因為用戶通常是指人,而Subject可以指人、進程、計劃任務、守護進程等。准確的說,Subject指的是“當前和軟件交互的事物”。在多數場景中,你可以將Subject粗暴地認為是用戶。
Subject對象都會和一個SecurityManager對象綁定。當你和一個Subject交互時,這些交互行為會被相應的SecurityManager翻譯為subject-specific的行為。
- SecurityManager:SecurityManager是Shiro結構中的核心。它用來協調其內部的各種安全組件。然而,一旦SecurityManager和其內部的安全組件配置完成後,程序員就不再會用到它了,這時候程序員通常是與Subject的API打交道。
我們將在後序教程中詳細介紹SecurityManager。但是在此之前,要知道當我們與Subject交互時,實際上是SecurityManager在幕後幫我們完成了那些操作,從上面的圖中也可以看出這一點。
- Realms:Realms就像一個橋或連接器,將Shiro和你的應用安全數據連接起來。當我們用安全相關的數據交互時,比如用戶賬戶的身份驗證(登錄)和授權管理,Shiro會從一個或多個配置好的Realms中尋找相關數據。
從這個角度來說,Realms實際上是一個DAO:將連接到數據源的細節封裝到內部,並且使Shiro可以輕易地讀取相關的數據。當我們配置Shiro時,必須至少有一個Realms。SecurityManager可以由多個Realms配置,但至少有一個Realms配置。
Shiro提供了多種Realms去連接數據源,如LDAP,數據庫(JDBC),文本配置文件(如INI)。
和其他內部組件一樣,SecurityManager管理Realms如何獲取安全數據和認證數據去配置Subject。
二、詳細結構
下圖展示了Shiro的詳細結構:
- Subject:如上文所述。
- SecurityManager:如上文所述。
- Authenticator(認證器):Authenticator是一個負責執行用戶登錄並對此做出相應動作的內部組件。當用戶嘗試登錄時,邏輯上是Authenticator在執行這個動作。Authenticator知道如何協調一個或多個存儲了用戶/賬戶信息的Realms。從Realms獲取的信息被用了認證用戶身份。
Authentication Strategy是指當有多個Realms時,如果一個Realms登錄成功了,然而其他的Realms登錄失敗了,那麼本次登錄是成功的還是失敗的?這由Authentication Stratege決定。
- Authorizer(核准器):Authorizer是一個負責權限控制的組件。和Authenticator類似,Authorizer知道如何協調一個或多個存儲了角色和許可的數據源。Authorizer用這些信息決定用戶是否允許做某一動作。
- SessionManager(會話管理):SessionManager知道如何創建並管理一個用戶Session。這個特性是其他安全管理框架所不具有的。無論任何環境,Shiro都可以在本地管理Session,即使沒有web/servlet或EJB容器。SessionDAO可以管理使用何種數據源去實現Session。
- CacheManager(緩存管理):CacheManager創建並管理Cache對象的生命周期。因為Shiro要訪問很多底層的數據源進行身份認證、權限管理和Session管理的操作,所以緩存處於最底層用以提高性能。任何開源的緩存框架都可以集成到Shiro中。
- Cryptography (加密):Shiro的crypro包包含了很多易用的加密算法。
- Realms:如前文所述。
三、The SecurityManager
因為Shior鼓勵程序員以Subject為中心開發應用,所以程序員幾乎不會和SecurityManager打交道。即便如此,深入地了解一下SecurityManager還是很有必要的。
如前文所述,SecurityManager處理安全操作、管理所有用戶的狀態,在Shiro默認的SecurityManager中包括下述功能:
- Authentication
- Authoriztion
- Session Managerment
- Cache Managerment
- Realm coordination
- Event propagation(事件傳播)
- “記住我”服務
- 創建Subject
- 登出等
為了簡化配置並且增強拓展性,Shiro的所有設計都是非常模塊化的。如前面詳細結構中所敘述的,Shiro將這些復雜的工作設計成了一個又一個模塊,而並非完全由SecurityManager完成。
SecurityManager還兼容了JavaBeans,這就允許你通過JavaBeans的accessor/mutator(get/set)自定義這些組件,用JavaBeans風格的配置(如Spring、Guice、JBoss)去配置SecurityManager將會非常簡單。我們將在後續教程中做詳細介紹。