Shiro 可以非常容易的開發(fā)出足夠好的應(yīng)用,其不僅可以用在 JavaSE 環(huán)境骗随,也可以用在JavaEE 環(huán)境。Shiro 可以幫助我們完成:認證赴叹、授權(quán)鸿染、加密、會話管理乞巧、與 Web 集成涨椒、緩存等。
Authentication:身份認證/登錄绽媒,驗證用戶是不是擁有相應(yīng)的身份蚕冬;
Authorization:授權(quán),即權(quán)限驗證是辕,驗證某個已認證的用戶是否擁有某個權(quán)限囤热;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色获三∨园或者細粒度的驗證某個用戶對某個資源是否具有某個權(quán)限;
Session Manager:會話管理疙教,即用戶登錄后就是一次會話棺聊,在沒有退出之前,它的所有信息都在會話中贞谓;會話可以是普通JavaSE 環(huán)境的躺屁,也可以是如 Web 環(huán)境的;
Cryptography:加密经宏,保護數(shù)據(jù)的安全性犀暑,如密碼加密存儲到數(shù)據(jù)庫驯击,而不是明文存儲;
Web Support:Web 支持耐亏,可以非常容易的集成到 Web 環(huán)境徊都;
Caching:緩存,比如用戶登錄后广辰,其用戶信息暇矫、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率择吊;
Concurrency:shiro 支持多線程應(yīng)用的并發(fā)驗證李根,即如在一個線程中開啟另一個線程,能把權(quán)限自動傳播過去几睛;
Testing:提供測試支持房轿;
Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
Remember Me:記住我所森,這個是非常常見的功能囱持,即一次登錄后,下次再來的話不用登錄了焕济。
注:Shiro 不會去維護用戶纷妆、維護權(quán)限;這些需要我們自己去設(shè)計/提供晴弃;然后通過相應(yīng)的接口注入給 Shiro 即可掩幢。
從外部看,Shiro 中對外交互的API如下:
Subject:主體上鞠,代表了當前“用戶”际邻,這個用戶不一定是一個具體的人,與當前應(yīng)用交互的任何東西都是
Subject
旗国,如網(wǎng)絡(luò)爬蟲枯怖,機器人等注整;即一個抽象概念能曾;所有Subject
都綁定到SecurityManager
,與Subject
的所有交互都會委托給SecurityManager
肿轨;可以把Subject
認為是一個門面寿冕;SecurityManager
才是實際的執(zhí)行者;SecurityManager:安全管理器椒袍;即所有與安全有關(guān)的操作都會與
SecurityManager
交互驼唱;且它管理著所有Subject
;可以看出它是 Shiro 的核心驹暑,它負責(zé)與后邊介紹的其他組件進行交互玫恳,如果學(xué)習(xí)過 SpringMVC辨赐,你可以把它看成DispatcherServlet
前端控制器;Realm:域京办,Shiro 從從
Realm
獲取安全數(shù)據(jù)(如用戶掀序、角色、權(quán)限)惭婿,就是說SecurityManager
要驗證用戶身份不恭,那么它需要從Realm
獲取相應(yīng)的用戶進行比較以確定用戶身份是否合法;也需要從Realm
得到用戶相應(yīng)的角色/權(quán)限進行驗證用戶是否能進行操作财饥;可以把Realm
看成 DataSource换吧,即安全數(shù)據(jù)源。
從內(nèi)部看钥星,Shiro 中的架構(gòu)如下:
Subject:主體沾瓦,可以看到主體可以是任何可以與應(yīng)用交互的“用戶”;
SecurityManager : 相 當 于 SpringMVC 中 的
DispatcherServlet
或 者 Struts2 中 的FilterDispatcher
打颤;是 Shiro 的心臟暴拄;所有具體的交互都通過SecurityManager
進行控制;它管理著所有Subject
编饺、且負責(zé)進行認證和授權(quán)乖篷、及會話、緩存的管理透且。Authenticator:認證器撕蔼,負責(zé)主體認證的,這是一個擴展點秽誊,如果用戶覺得 Shiro 默認的不好鲸沮,可以自定義實現(xiàn);其需要認證策略(Authentication Strategy)锅论,即什么情況下算用戶認證通過了讼溺;
Authrizer:授權(quán)器,或者訪問控制器最易,用來決定主體是否有權(quán)限進行相應(yīng)的操作怒坯;即控制著用戶能訪問應(yīng)用中的哪些功能;
Realm:可以有 1 個或多個 Realm藻懒,可以認為是安全實體數(shù)據(jù)源剔猿,即用于獲取安全實體的;可以是 JDBC 實現(xiàn)嬉荆,也可以是 LDAP 實現(xiàn)归敬,或者內(nèi)存實現(xiàn)等等;由用戶提供;注意:不知道你的用戶/權(quán)限存儲在哪及以何種格式存儲汪茧;所以我們一般在應(yīng)用中都需要實現(xiàn)自己的 Realm椅亚;
SessionManager:如果寫過 Servlet 就應(yīng)該知道 Session 的概念,Session 呢需要有人去管理它的生命周期舱污,這個組件就是 SessionManager什往;而 Shiro 并不僅僅可以用在 Web 環(huán)境,也可以用在如普通的 JavaSE 環(huán)境慌闭、EJB 等環(huán)境别威;所有呢,Shiro 就抽象了一個自己的 Session來管理主體與應(yīng)用之間交互的數(shù)據(jù)驴剔;這樣的話省古,比如我們在 Web 環(huán)境用,剛開始是一臺Web 服務(wù)器丧失;接著又上了臺 EJB 服務(wù)器豺妓;這時想把兩臺服務(wù)器的會話數(shù)據(jù)放到一個地方,這個時候就可以實現(xiàn)自己的分布式會話(如把數(shù)據(jù)放到 Memcached 服務(wù)器)布讹;
SessionDAO:DAO 大家都用過琳拭,數(shù)據(jù)訪問對象,用于會話的 CRUD描验,比如我們想把 Session保存到數(shù)據(jù)庫白嘁,那么可以實現(xiàn)自己的 SessionDAO,通過如 JDBC 寫到數(shù)據(jù)庫膘流;比如想把Session 放到 Memcached 中絮缅,可以實現(xiàn)自己的 Memcached SessionDAO;另外 SessionDAO中可以使用 Cache 進行緩存呼股,以提高性能耕魄;
CacheManager:緩存控制器,來管理如用戶彭谁、角色吸奴、權(quán)限等的緩存的;因為這些數(shù)據(jù)基本
上很少去改變缠局,放到緩存中后可以提高訪問的性能Cryptography:密碼模塊则奥,Shiro 提高了一些常見的加密組件用于如密碼加密/解密的。