Shiro權(quán)限管理框架
1.Shiro介紹
1.1 什么是Shiro
? Apache Shrio是JAVA 的一個(gè)安全框架关串。Shiro可以非常容易的開(kāi)發(fā)出足夠好的應(yīng)用,其不僅可以應(yīng)用于Java SE環(huán)境,也可以應(yīng)用在Java EE環(huán)境荸型。Shiro可以幫助我們完成:<u>認(rèn)證、授權(quán)舵抹、加密榜贴、會(huì)話(huà)管理矢赁、與Web集成糯笙、緩存等。</u>
1.2為什么要學(xué)習(xí)Shiro
- 既然Shiro將安全認(rèn)證相關(guān)的功能抽取出來(lái)組成一個(gè)框架撩银,使用Shiro就可以非掣椋快速的完成認(rèn)證、授權(quán)等功能的開(kāi)發(fā)额获,降低系統(tǒng)開(kāi)發(fā)成本够庙。
- Shiro使用廣泛,Shiro可以應(yīng)用在web應(yīng)用抄邀,非Web應(yīng)用耘眨,集群應(yīng)用中越來(lái)越多的用戶(hù)開(kāi)始使用Shiro。
- Java領(lǐng)域中Spring Security(原名 Acegi)也是一個(gè)開(kāi)源的權(quán)限管理框架境肾,但是Spring Security以來(lái)Spring運(yùn)行剔难。而Shrio就相對(duì)獨(dú)立胆屿,最主要是因?yàn)镾hiro使用簡(jiǎn)單、靈活,所以現(xiàn)在越來(lái)越多的用戶(hù)選擇Shrio偶宫。
1.3 基本功能
? Shiro基本功能點(diǎn)
Authentication:身份認(rèn)證/登錄非迹,驗(yàn)證用戶(hù)是不是擁有相應(yīng)的身份;
Authorization:授權(quán)纯趋,即權(quán)限驗(yàn)證彻秆,驗(yàn)證某個(gè)已認(rèn)證用戶(hù)是否擁有某個(gè)權(quán)限;即判斷用戶(hù)是否能做事情结闸。常見(jiàn)的如:驗(yàn)證某個(gè)用戶(hù)是否擁有某個(gè)角色【贫洌或者細(xì)粒度的驗(yàn)證某個(gè)用戶(hù)對(duì)某個(gè)資源是否有某個(gè)權(quán)限桦锄;
Session Management:會(huì)話(huà)管理,即用戶(hù)登錄后就是一次會(huì)話(huà)蔫耽,在沒(méi)有退出之前结耀,它的所有信息都在會(huì)話(huà)中。會(huì)話(huà)可以是普通的Java SE環(huán)境匙铡,也可以是如Web環(huán)境图甜。
Cyptography:加密,保護(hù)數(shù)據(jù)的安全性鳖眼,比如密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù)黑毅,而不是明文存儲(chǔ)到數(shù)據(jù)庫(kù);
Web Support:Web支持钦讳,可以非常容易的集成到Web環(huán)境中矿瘦;
Cache :緩存,比如用戶(hù)登錄后愿卒,其用戶(hù)信息缚去、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率琼开;
Concurrency:Shiro支持多程序應(yīng)用的并發(fā)驗(yàn)證易结,即如在一個(gè)線(xiàn)程中開(kāi)啟另一個(gè)線(xiàn)程,能把權(quán)限自動(dòng)傳播過(guò)去柜候;
Testing:提供測(cè)試支持搞动;
Run As:允許一個(gè)用戶(hù)假裝為另一個(gè)用戶(hù)(如果他們?cè)试S)的身份進(jìn)行訪(fǎng)問(wèn);
Remember Me:記住我改橘,這個(gè)是非常常見(jiàn)的功能滋尉,即一次登錄后,下次再來(lái)就不需要登錄了飞主。
*注:Shiro不會(huì)去維護(hù)用戶(hù)狮惜、維護(hù)權(quán)限高诺;這些需要我們自己去設(shè)計(jì)/提供;然后通過(guò)相應(yīng)的接口注入給Shiro即可碾篡。
1.4Shiro的架構(gòu)
1.4.1從外部看Shiro
? 對(duì)于一個(gè)好的框架虱而,從外部來(lái)看應(yīng)該具有非常簡(jiǎn)單易于使用的API,且API契約明確开泽;從內(nèi)部來(lái)看牡拇,其應(yīng)該有一個(gè)可擴(kuò)展的架構(gòu),即非常容易插入用戶(hù)自定義的實(shí)現(xiàn)穆律。因?yàn)槿魏慰蚣芏疾荒軡M(mǎn)足所有要求惠呼。
? 首先,從外部來(lái)看Shiro峦耘,即從應(yīng)用程序角度來(lái)觀察如何使用Shiro完成工作剔蹋。如下圖:
? 可以看到:應(yīng)用代碼直接交互的對(duì)象是Subject,也就是說(shuō)Shiro的對(duì)外API核心就是Subject;每個(gè)API的含義如下:
Subject(主體):代表了當(dāng)前“用戶(hù)”辅髓,這個(gè)用戶(hù)不一定是一個(gè)具體的人泣崩,與當(dāng)前應(yīng)用交互的任何東西都是Subject,如網(wǎng)絡(luò)爬蟲(chóng)洛口,機(jī)器人等矫付;即一個(gè)抽象概念;所有Subject都綁定到SecurityManager第焰,與Subject的所有交互都會(huì)委托給SecurityManager买优;可以把Subject認(rèn)為是一個(gè)門(mén)面;SecurityManager才是實(shí)際的執(zhí)行者樟遣;
Security Manager(安全管理器):即所有與安全有關(guān)的操作都會(huì)與SecurityManager交互而叼;且它管理著所有Subject;可以看出它是Shiro的核心豹悬,它負(fù)責(zé)與后邊介紹的其他組件進(jìn)行交互葵陵,如果學(xué)習(xí)過(guò)SpringMVC,你可以把它看成DispatcherServlet前端控制器瞻佛;
Realm(域):Shiro從從Realm獲取安全數(shù)據(jù)(如用戶(hù)脱篙、角色、權(quán)限)伤柄,就是說(shuō)SecurityManager要驗(yàn)證用戶(hù)身份绊困,那么它需要從Realm獲取相應(yīng)的用戶(hù)進(jìn)行比較以確定用戶(hù)身份是否合法;也需要從Realm得到用戶(hù)相應(yīng)的角色/權(quán)限進(jìn)行驗(yàn)證用戶(hù)是否能進(jìn)行操作适刀;可以把Realm看成DataSource秤朗,即安全數(shù)據(jù)源。
也就是說(shuō)對(duì)于我們而言笔喉,最簡(jiǎn)單的一個(gè)Shiro應(yīng)用:
1取视、應(yīng)用代碼通過(guò)Subject來(lái)進(jìn)行認(rèn)證和授權(quán)硝皂,而Subject又委托給SecurityManager;
2作谭、我們需要給Shiro的SecurityManager注入Realm稽物,從而讓SecurityManager能得到合法的用戶(hù)及其權(quán)限進(jìn)行判斷。
從以上也可以看出折欠,Shiro不提供維護(hù)用戶(hù)/權(quán)限贝或,而是通過(guò)Realm讓開(kāi)發(fā)人員自己注入。
1.4.2 從內(nèi)部看Shiro
Subject:即主體锐秦,外部應(yīng)用與Subject進(jìn)行交互咪奖,subject記錄了當(dāng)前操作用戶(hù),將用戶(hù)的概念理解為當(dāng)前操作的主體酱床,可能是一個(gè)通過(guò)瀏覽器請(qǐng)求的用戶(hù)赡艰,也可能是一個(gè)運(yùn)行的程序。
Subject在Shiro中是一個(gè)接口斤葱,接口定義了很多認(rèn)證授權(quán)相關(guān)的方法,外部程序通過(guò)subject進(jìn)行授權(quán)揖闸,而subject是通過(guò)SecurityManager安全管理器進(jìn)行授權(quán)揍堕。
SecurityManager:即安全管理器,對(duì)全部的subject進(jìn)行安全管理汤纸,它是SHiro的核心衩茸,負(fù)責(zé)對(duì)所有的subject進(jìn)行安全管理。通過(guò)SecurityManager可以完成subject的認(rèn)證贮泞、授權(quán)等楞慈。**實(shí)質(zhì)上是SecurityManager通過(guò)Authenticator進(jìn)行認(rèn)證,通過(guò)Authorizer進(jìn)行授權(quán)啃擦,通過(guò)SecurityManager進(jìn)行會(huì)話(huà)管理等囊蓝。
SecurityManager是一個(gè)接口,繼承了Authenticator令蛉、Authorizer聚霜、SessionManager這三個(gè)接口。
Authenticator:即認(rèn)證器珠叔,對(duì)用戶(hù)身份進(jìn)行認(rèn)證蝎宇,Authenticator是一個(gè)接口,Shiro提供ModularRealmAuthenticator實(shí)現(xiàn)類(lèi)祷安,通過(guò)ModularRealmAuthenticator基本上可以滿(mǎn)足大多數(shù)需求姥芥,也可以自定義認(rèn)證器。
Authorizer:即授權(quán)器汇鞭,用戶(hù)通過(guò)認(rèn)證器認(rèn)證通過(guò)凉唐,在訪(fǎng)問(wèn)功能時(shí)需要授權(quán)器判斷用戶(hù)是否具有此功能的操作權(quán)限庸追。
Realm:即領(lǐng)域,相當(dāng)于datasource數(shù)據(jù)源熊榛,SecurityManager進(jìn)行安全認(rèn)證需要Realm獲取用戶(hù)權(quán)限數(shù)據(jù)锚国,比如:如果用戶(hù)身份數(shù)據(jù)在數(shù)據(jù)庫(kù),那么Realm就需要從數(shù)據(jù)庫(kù)獲取用戶(hù)身份信息玄坦。
注:不要把Realm理解成只是從數(shù)據(jù)源數(shù)據(jù)血筑,在Realm中還有認(rèn)證授權(quán)的相關(guān)代碼。
SessionManager:即會(huì)話(huà)管理煎楣,shiro框架定義了一套會(huì)話(huà)管理豺总,它不依賴(lài)web容器的session,所以shiro可以使用在非web應(yīng)用上择懂,也可以將分布式應(yīng)用的會(huì)話(huà)集中在一點(diǎn)管理喻喳,此特性可使它實(shí)現(xiàn)單點(diǎn)登錄。
SessionDao:即會(huì)話(huà)dao困曙,是對(duì)session會(huì)話(huà)操作的一套接口表伦,比如要將session存儲(chǔ)到數(shù)據(jù)庫(kù),可以通過(guò)jdbc將會(huì)話(huà)存儲(chǔ)到數(shù)據(jù)庫(kù)慷丽。
CacheManager:即緩存管理蹦哼,將用戶(hù)權(quán)限數(shù)據(jù)存儲(chǔ)到緩存,這樣可以提高性能要糊。
Cryptography:即密碼管理纲熏,Shiro提供一套加密/解密的組件,方便開(kāi)發(fā)锄俄。比如提供常用的散列局劲、加密/解密等管理。
2.認(rèn)證
2.1基本概念
2.1.1 身份驗(yàn)證
即在應(yīng)用中能夠證明當(dāng)前用戶(hù)就是本人奶赠。比如提供他們的身份ID或一些標(biāo)識(shí)信息來(lái)表明他就是本人鱼填,如提供身份證、用戶(hù)名/密碼來(lái)證明毅戈。
2.1.2 principals
身份剔氏,即主體的標(biāo)識(shí)屬性,可以是任何東西竹祷,如用戶(hù)名谈跛、郵箱等,唯一即可塑陵。一個(gè)主體可以有多個(gè)principals,但只有一個(gè)Primary Principals感憾,一般是用戶(hù)名/密碼/手機(jī)號(hào)。
2.1.3 credentials
證明/憑證,即只有主體知道的安全值阻桅,如密碼/數(shù)字證書(shū)等凉倚。
最常見(jiàn)的principals和credentials組合就是用戶(hù)名/密碼
2.2 認(rèn)證流程
?