前言:
大家做登錄,權(quán)限什么的都是五花八門削樊,各種花里胡哨的代碼滥搭,不同系統(tǒng)的做法很有可能千差萬別酸纲。但是使用shiro這個(gè)安全框架之后,大家做權(quán)限的方式都一致化了论熙,這樣的好處就是你的代碼看起來容易福青,我的代碼你也好理解。shiro也比較成熟脓诡,基本上滿足大部分的權(quán)限需要无午。
什么是Shiro
Apache Shiro是一個(gè)功能強(qiáng)大、靈活的祝谚,開源的安全(權(quán)限)框架宪迟。它將軟件系統(tǒng)的安全認(rèn)證向相關(guān)的功能抽取出來,實(shí)現(xiàn)用戶身份認(rèn)證交惯,權(quán)限授權(quán)次泽,加密,會(huì)話管理等功能席爽,組成一個(gè)通用的安全認(rèn)證框架意荤。
Shiro和Spring Security比較
都是用來做項(xiàng)目中的權(quán)限管理
簡(jiǎn)單易用,只需要花費(fèi)很少的時(shí)間只锻。
符合公司的業(yè)務(wù)需求 和開發(fā)成本玖像,團(tuán)隊(duì)的學(xué)習(xí)成本
Shiro 致力在所有應(yīng)用環(huán)境下實(shí)現(xiàn)上述功能,小到命令行應(yīng)用程序齐饮,大到企業(yè)應(yīng)用中捐寥,而且不 需要借助第三方框架笤昨、容器、應(yīng)用服務(wù)器等握恳。當(dāng)然 Shiro 的目的是盡量的融入到這樣的應(yīng)用環(huán) 境中去瞒窒,但也可以在它們之外的任何環(huán)境下開箱即用。
寫代碼
為什么要用shiro
使用shiro就可以非诚缤荩快速的完成認(rèn)證崇裁,授權(quán)等功能的開發(fā),降低系統(tǒng)的成本時(shí)間
shiro使用廣泛就珠,shiro可以運(yùn)行在web應(yīng)用寇壳,非web應(yīng)用,集群分布式應(yīng)用中使用shiro的用戶也越來越多
什么是權(quán)限管理
shiro主要是完成權(quán)限管理
? 基本涉及到用戶參與的系統(tǒng)都要進(jìn)行權(quán)限管理妻怎,權(quán)限管理屬于系統(tǒng)安全的范疇(只要有人的參與都要進(jìn)行權(quán)限管理)壳炎,權(quán)限管理實(shí)現(xiàn)對(duì)用戶訪問系統(tǒng)的控制,按照安全規(guī)則或者安全策略控制用戶可以訪問而且只能訪問自己被授權(quán)的資源逼侦。
權(quán)限管理包括用戶身份驗(yàn)證和授權(quán)兩部分匿辩,簡(jiǎn)稱認(rèn)證授權(quán),對(duì)于需要訪問控制的資源用戶首先經(jīng)過身份認(rèn)證榛丢,認(rèn)證通過后用戶具有該資源的訪問權(quán)限可訪問铲球。
shiro有什么用
驗(yàn)證用戶來核實(shí)他們的身份
1.對(duì)用戶執(zhí)行訪問控制:①判斷用戶是否被分配了一個(gè)確定安全的角色
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?②判斷用戶是否被允許做某事
2.在任何環(huán)境下使用Session API,即使沒有Web或EJB容器晰赞。
3.在身份驗(yàn)證稼病,訪問控制期間或在會(huì)話的生命周期,對(duì)事件作出反應(yīng)掖鱼。
4.聚集一個(gè)或多個(gè)用戶安全數(shù)據(jù)的數(shù)據(jù)源然走,并作為一個(gè)單一的復(fù)合用戶“視圖”。
5.啟用單點(diǎn)登錄(SSO)功能戏挡。
6.為沒有關(guān)聯(lián)到登錄的用戶啟用"Remember Me"服務(wù)
7.以及更多——全部集成到緊密結(jié)合的易于使用的API中
Shiro 視圖在所有應(yīng)用程序環(huán)境下實(shí)現(xiàn)這些目標(biāo)——從最簡(jiǎn)單的命令行應(yīng)用程序到最大的企業(yè)應(yīng)用芍瑞,不強(qiáng)制依賴其他第三方框架,容器褐墅,或應(yīng)用服務(wù)器拆檬。當(dāng)然,該項(xiàng)目的目標(biāo)是盡可能地融入到這些環(huán)境妥凳,但它能夠在任何環(huán)境下立即可用竟贯。
Shiro特性
全面的,蘊(yùn)含豐富功能的安全框架
Authentication(認(rèn)證):通常被稱為“登錄” 逝钥,是一個(gè)證明當(dāng)前用戶的身份是否是 ? ? 所說的用戶的行為
Authorization(授權(quán)):訪問控制的過程澄耍。就是某個(gè)用戶是否具有某個(gè)訪問的權(quán)限 ? 或某個(gè)操作的使用權(quán)限。
Session Management(會(huì)話管理):即用戶登錄后就是一次會(huì)話,在沒有退出之前齐莲,它的所有信息都在會(huì)話中;會(huì)話可以是普通JavaSE環(huán)境的磷箕,也可以是如Web環(huán)境的选酗;
Cryptography(加密):在對(duì)數(shù)據(jù)源使用加密算法加密的同時(shí),保證易于使用岳枷。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 保護(hù)數(shù)據(jù)的安全性芒填,例如密碼加密存儲(chǔ)到數(shù)據(jù)庫,而不是 通過明文存儲(chǔ)空繁。
還有其他功能來支持和加強(qiáng)這些不同應(yīng)用環(huán)境下安全領(lǐng)域的關(guān)注點(diǎn)殿衰,特別是對(duì)一下功能的支持:
Web支持:Shiro 提供的 web 支持 api ,可以很輕松的保護(hù) web 應(yīng)用程序的安? ? ? ? ? ? ? ? ? ? ? ? ? ? 全盛泡。
緩存:例如用戶登錄之后闷祥,其用戶信息,用戶角色權(quán)限等都不需要每次都進(jìn)行查 ? ? 詢傲诵,是 Apache Shiro 保證安全操作快速凯砍、高效的重要手段。
并發(fā): shiro支持多線程應(yīng)用并發(fā)驗(yàn)證拴竹,即在一個(gè)線程中開啟另一個(gè)線程能夠把? ? ? ? ? 權(quán)限自動(dòng)傳播過去
測(cè)試:支持單元測(cè)試和集成測(cè)試悟衩,確保代碼和預(yù)想的一樣安全。
"Run As":這個(gè)功能允許用戶假設(shè)另一個(gè)用戶的身份(在許可的前提下),有時(shí)候再管? ? ? ? ? ? ? ? ? ? ? 理腳本很有用
"Remember Me":跨 session 記錄用戶的身份栓拜,只有在強(qiáng)制需要時(shí)才需要登錄座泳。
Shiro架構(gòu)
Shiro的三個(gè)核心組件
Subject
Subject:即“當(dāng)前操作用發(fā)戶”。但是幕与,在Shiro中挑势,Subject這一概念并不僅僅指人,也可以是第三方進(jìn)程纽门、后臺(tái)帳戶(Daemon Account)或其他類似事物薛耻。它僅僅意味著“當(dāng)前跟軟件交互的東西”。但考慮到大多數(shù)目的和用途赏陵,你可以把它認(rèn)為是Shiro的“用戶”概念饼齿。Subject代表了當(dāng)前用戶的安全操作,SecurityManager則管理所有用戶的安全操作蝙搔。
SecurityManager
SecurityManager是Shiro架構(gòu)的心臟缕溉,并作為一種“保護(hù)傘”對(duì)象來協(xié)調(diào)內(nèi)部的安全組件共同構(gòu)成一個(gè)對(duì)象圖。然而吃型,一旦SecurityManager和它的內(nèi)置對(duì)象圖已經(jīng)配置給一個(gè)應(yīng)用程序证鸥,那么它單獨(dú)留下來,且應(yīng)用程序開發(fā)人員幾乎使用他們所有的時(shí)間來處理Subject API。
稍后會(huì)更詳細(xì)地討論SecurityManager枉层,但重要的是要認(rèn)識(shí)到泉褐,當(dāng)你正與一個(gè)Subject進(jìn)行交互時(shí),實(shí)質(zhì)上是幕后的 SecurityManager處理所有繁重的Subject安全操作鸟蜡。這反映在上面的基本流程圖膜赃。
Realm
Realms擔(dān)當(dāng)Shiro和你的應(yīng)用程序的安全數(shù)據(jù)之間的“橋梁”或“連接器”。當(dāng)它實(shí)際上與安全相關(guān)的數(shù)據(jù)如用來執(zhí)行身份驗(yàn)證(登錄)及授權(quán)(訪問控制)的用戶帳戶交互時(shí)揉忘,Shiro 從一個(gè)或多個(gè)為應(yīng)用程序配置的Realm中尋找許多這樣的東西跳座。
在這個(gè)意義上說,Realm本質(zhì)上是一個(gè)特定安全的DAO:它封裝了數(shù)據(jù)源的連接詳細(xì)信息泣矛,使Shiro所需的相關(guān)的數(shù)據(jù)可用疲眷。當(dāng)配置Shiro時(shí),你必須指定至少一個(gè)Realm用來進(jìn)行身份驗(yàn)證和/或授權(quán)您朽。SecurityManager可能配置多個(gè)Realms狂丝,但至少有一個(gè)是必須的。
Shiro提供了立即可用的Realms來連接一些安全數(shù)據(jù)源(即目錄)虚倒,如LDAP美侦,關(guān)系數(shù)據(jù)庫(JDBC),文本配置源魂奥,像 INI 及屬性文件菠剩,以及更多。你可以插入你自己的Realm 實(shí)現(xiàn)來代表自定義的數(shù)據(jù)源耻煤,如果默認(rèn)地Realm不符合你的需求具壮。
像其他內(nèi)置組件一樣,Shiro SecurityManager控制 Realms是如何被用來獲取安全和身份數(shù)據(jù)來代表 Subject 實(shí)例的哈蝇。
工作流程
用戶棺妓、角色、權(quán)限
會(huì)給角色賦予權(quán)限炮赦,給用戶賦予角色
1怜跑、UsernamePasswordToken,Shiro 用來封裝用戶登錄信息吠勘,使用用戶的登錄信息來創(chuàng)建令牌 Token性芬。
2、SecurityManager剧防,Shiro 的核心部分植锉,負(fù)責(zé)安全認(rèn)證和授權(quán)。
3峭拘、Suject俊庇,Shiro 的一個(gè)抽象概念狮暑,包含了用戶信息。
4辉饱、Realm搬男,開發(fā)者自定義的模塊,根據(jù)項(xiàng)目的需求鞋囊,驗(yàn)證和授權(quán)的邏輯全部寫在 Realm 中止后。
5、AuthenticationInfo溜腐,用戶的角色信息集合,認(rèn)證時(shí)使用瓜喇。
6挺益、AuthorzationInfo,角色的權(quán)限信息集合乘寒,授權(quán)時(shí)使用望众。
7、DefaultWebSecurityManager伞辛,安全管理器烂翰,開發(fā)者自定義的 Realm 需要注入到 DefaultWebSecurityManager 進(jìn)行管理才能生效。
8蚤氏、ShiroFilterFactoryBean甘耿,過濾器工廠,Shiro 的基本運(yùn)行機(jī)制是開發(fā)者定制規(guī)則竿滨,Shiro 去執(zhí)行佳恬,具體的執(zhí)行操作就是由 ShiroFilterFactoryBean 創(chuàng)建的一個(gè)個(gè) Filter 對(duì)象來完成。
9.SimpleAuthorizationInfo()獲取角色于游,獲取權(quán)限
10.SimpleAuthenticationInfo()獲取用戶名毁葱,密碼
下一期:Shiro教程+springboot整合shiro(二:代碼學(xué)習(xí))