Shiro的設計目標是簡化應用的安全管理工做。軟件一般是以用戶爲基礎設計的。也就是說,咱們常常是根據用戶是怎樣和咱們的軟件交互的來設計相關的用戶接口。好比,你可能會說「若是是已經登陸的用戶與個人軟件交互,那麼我給他就顯示一個按鈕,讓他點擊後能夠查看本身的帳戶信息。若是用戶沒有登陸,那麼我就顯示一個註冊按鈕」。程序員
這個例子說明了咱們軟件中不少代碼都是爲了知足用戶需求而寫。即便「用戶」有時候壓根就不是一我的(好比說另外一個軟件系統)。web
Shiro的設計反映了這些思想,這樣使得開發者更加容易理解Shiro中的一些概念,也使得Shiro更加易用。算法
1、概覽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。
2、詳細結構
下圖展現了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:如前文所述。
3、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將會很是簡單。咱們將在後續教程中作詳細介紹。性能