一:Shiro簡(jiǎn)介
Apache Shiro是Java的一個(gè)安全框架。
Shiro 比Spring Security更簡(jiǎn)單輕量。
Shiro 可以實(shí)現(xiàn)認(rèn)證、授權(quán)、加密、會(huì)話管理、與Web集成、緩存等
Shiro不僅可以用在JavaSE環(huán)境,也可以用在JavaEE環(huán)境
Authentication :身份認(rèn)證/登錄,驗(yàn)證用戶是不是擁有相應(yīng)的身份;
Authorization :授權(quán),即權(quán)限驗(yàn)證,驗(yàn)證某個(gè)已認(rèn)證的用戶是否擁有某個(gè)權(quán)限;
Session Manager :會(huì)話管理,即用戶登錄后就是一次會(huì)話,在沒(méi)有退出之前,它的所有信息都在會(huì)話中;會(huì)話可以是普通JavaSE環(huán)境的, 也可以是J2EE環(huán)境的,如Web環(huán)境;
Cryptography :加密,保護(hù)數(shù)據(jù)的安全性,如密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù),而不是明文存儲(chǔ);
Web Support :Web支持,可以非常容易的集成到Web環(huán)境;
Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率;
Concurrency :Shiro支持多線程應(yīng)用的并發(fā)驗(yàn)證,即如在一個(gè)線程中開(kāi)啟另一個(gè)線程,能把權(quán)限自動(dòng)傳播過(guò)去;
Testing :提供測(cè)試支持;
Run As :允許一個(gè)用戶假裝為另一個(gè)用戶(如果他們?cè)试S)的身份進(jìn)行訪問(wèn);
Remember Me :記住我,這個(gè)是非常常見(jiàn)的功能,即一次登錄后,下次再訪問(wèn)的話不用重新登錄。
二:Shiro架構(gòu)
Subject :主體,可以看到主體可以是任何可以與應(yīng)用交互的“用戶”;
SecurityManager :相當(dāng)于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher;是Shiro的心臟;所有具體的交互都通過(guò)SecurityManager進(jìn)行控制;它管理著所有Subject、且負(fù)責(zé)進(jìn)行認(rèn)證和授權(quán)、及會(huì)話、緩存的管理。
Authenticator :認(rèn)證器,負(fù)責(zé)主體認(rèn)證的,這是一個(gè)擴(kuò)展點(diǎn),如果用戶覺(jué)得Shiro默認(rèn)的不好,可以自定義實(shí)現(xiàn)
Authrizer :授權(quán)器,或者訪問(wèn)控制器,用來(lái)決定主體是否有權(quán)限進(jìn)行相應(yīng)的操作;即控制著用戶能訪問(wèn)應(yīng)用中的哪些功能;
Realm :可以有1個(gè)或多個(gè)Realm,可以認(rèn)為是安全實(shí)體數(shù)據(jù)源,即用于獲取安全實(shí)體的;可以是JDBC實(shí)現(xiàn),也可以是LDAP實(shí)現(xiàn),或者內(nèi)存實(shí)現(xiàn)等等,一般應(yīng)用中都需要實(shí)現(xiàn)自己的Realm
SessionManager : 不需要通過(guò)Servlet容器既可以實(shí)現(xiàn)Session管理,可以用于 JavaSE和 JavaEE環(huán)境。
SessionDAO : Session存儲(chǔ),可以使用數(shù)據(jù)庫(kù)或者緩存。
CacheManager : 緩存控制器,來(lái)管理如用戶、角色、權(quán)限等的緩存的
Cryptography : 密碼模塊,Shiro提高了一些常見(jiàn)的加密組件用于如密碼加密/解密的。
三:Shiro核心組件
1. Subject: 主體,代表了當(dāng)前“用戶”,與當(dāng)前應(yīng)用交互的任何東西都是Subject,如網(wǎng)格爬蟲(chóng),機(jī)器人等,是一個(gè)抽象的概念;所有Subject都綁定到SecurityManager,與Subject的所有交互都會(huì)委托給SecurityManager. 可以把Subject認(rèn)為是一個(gè)門(mén)面,SecurityManager才是實(shí)際的執(zhí)行者。
2.SecurityManager: 安全管理器,所有與安全相關(guān)的操作都會(huì)與SecurityManager交互;它管理著所有Subject;是Shiro的核心。類似于SpringMVC中的DispatcherServlet。
3.Realm: 域,Shiro從Realm獲取安全數(shù)據(jù)(如用戶,角色,權(quán)限),SecurityManager要驗(yàn)證用戶身份,需要從Realm獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否合法;也需要從Realm得到用戶相應(yīng)的角色/權(quán)限進(jìn)行驗(yàn)證用戶是否能進(jìn)行操作,可以把Realm看成DataSource,即安全數(shù)據(jù)源。
四:Shiro認(rèn)證和授權(quán)的基本流程
1、首先調(diào)用 Subject.login(token)進(jìn)行登錄,其會(huì)自動(dòng)委托給 Security Manager,調(diào)用之前必須通過(guò) SecurityUtils. setSecurityManager()設(shè)置;
2、 SecurityManager負(fù)責(zé)真正的身份驗(yàn)證邏輯;它會(huì)委托給 Authenticator進(jìn)行身份驗(yàn)證;
3、 Authenticator才是真正的身份驗(yàn)證者, Shiro API中核心的身份認(rèn)證入口點(diǎn),此處可以自定義插入自己的實(shí)現(xiàn);
4、 Authenticator可能會(huì)委托給相應(yīng)的 AuthenticationStrategy進(jìn)行多 Realm身份驗(yàn)證,默認(rèn) ModularRealmAuthenticator會(huì)調(diào)用 AuthenticationStrategy進(jìn)行多 Realm身份驗(yàn)證;
5、 Authenticator會(huì)把相應(yīng)的 token傳入 Realm,從 Realm獲取身份驗(yàn)證信息,如果沒(méi)有返回 /拋出異常表示身份驗(yàn)證失敗了。此處可以配置多個(gè) Realm,將按照相應(yīng)的順序及策略進(jìn)行訪問(wèn)。