非常详尽的 Shiro 架构解析
Shiro是什么?
Apache Shiro是一個(gè)強(qiáng)大而靈活的開源安全框架,它干凈利落地處理身份認(rèn)證,授權(quán),企業(yè)會(huì)話管理和加密。
Apache Shiro的首要目標(biāo)是易于使用和理解。安全有時(shí)候是很復(fù)雜的,甚至是痛苦的,但它沒有必要這樣。框架應(yīng)該盡可能掩蓋復(fù)雜的地方,露出一個(gè)干凈而直觀的API,來簡化開發(fā)人員在使他們的應(yīng)用程序安全上的努力。
官網(wǎng):http://shiro.apache.org
Shiro有什么用?
以下是你可以用Apache Shiro所做的事情:
-
驗(yàn)證用戶來核實(shí)他們的身份
-
對(duì)用戶執(zhí)行訪問控制,如:
判斷用戶是否被分配了一個(gè)確定的安全角色;
判斷用戶是否被允許做某事;
-
在任何環(huán)境下使用Session API,即使沒有Web或EJB容器。
-
在身份驗(yàn)證,訪問控制期間或在會(huì)話的生命周期,對(duì)事件作出反應(yīng)。
-
聚集一個(gè)或多個(gè)用戶安全數(shù)據(jù)的數(shù)據(jù)源,并作為一個(gè)單一的復(fù)合用戶“視圖”。
-
啟用單點(diǎn)登錄(SSO)功能。
-
為沒有關(guān)聯(lián)到登錄的用戶啟用"Remember Me"服務(wù)
-
以及更多——全部集成到緊密結(jié)合的易于使用的API中。
Shiro 視圖在所有應(yīng)用程序環(huán)境下實(shí)現(xiàn)這些目標(biāo)——從最簡單的命令行應(yīng)用程序到最大的企業(yè)應(yīng)用,不強(qiáng)制依賴其他第三方框架,容器,或應(yīng)用服務(wù)器。當(dāng)然,該項(xiàng)目的目標(biāo)是盡可能地融入到這些環(huán)境,但它能夠在任何環(huán)境下立即可用。
Shiro特性
Apache Shiro是一個(gè)擁有許多功能的綜合性的程序安全框架。
Shiro把Shiro開發(fā)團(tuán)隊(duì)稱為“應(yīng)用程序的四大基石”——身份驗(yàn)證,授權(quán),會(huì)話管理和加密作為其目標(biāo)。
-
Authentication:有時(shí)也簡稱為“登錄”,這是一個(gè)證明用戶是他們所說的他們是誰的行為。
-
Authorization:訪問控制的過程,也就是絕對(duì)“誰”去訪問“什么”。
-
Session Management:管理用戶特定的會(huì)話,即使在非 Web 或 EJB 應(yīng)用程序。
-
Cryptography:通過使用加密算法保持?jǐn)?shù)據(jù)安全同時(shí)易于使用。
也提供了額外的功能來支持和加強(qiáng)在不同環(huán)境下所關(guān)注的方面,尤其是以下這些:
-
Web Support:Shiro的web支持的API能夠輕松地幫助保護(hù) Web 應(yīng)用程序。
-
Caching:緩存是Apache Shiro中的第一層公民,來確保安全操作快速而又高效。
-
Concurrency:Apache Shiro利用它的并發(fā)特性來支持多線程應(yīng)用程序。
-
Testing:測(cè)試支持的存在來幫助你編寫單元測(cè)試和集成測(cè)試,并確保你的能夠如預(yù)期的一樣安全。
-
"Run As":一個(gè)允許用戶假設(shè)為另一個(gè)用戶身份(如果允許)的功能,有時(shí)候在管理腳本很有用。
-
"Remember Me":在會(huì)話中記住用戶的身份,所以他們只需要在強(qiáng)制時(shí)候登錄。
Shiro 架構(gòu)
Apache Shiro的設(shè)計(jì)目標(biāo)是通過直觀和易于使用來簡化應(yīng)用程序安全。Shiro 的核心設(shè)計(jì)體現(xiàn)了大多數(shù)人們是如何考慮應(yīng)用程序安全的——在某些人(或某些事)與應(yīng)用程序交互的背景下。
應(yīng)用軟件通常是基于用戶背景情況設(shè)計(jì)的。也就是說,你將經(jīng)常設(shè)計(jì)用戶接口或服務(wù)API,基于一個(gè)用戶將要(或應(yīng)該)如何與該軟件交互。例如,你可能會(huì)說,“如果用戶與我的應(yīng)用程序交互的用戶已經(jīng)登錄,我將顯示一個(gè)他們能夠點(diǎn)擊的按鈕來查看他們的帳戶信息。如果他們沒有登錄,我將顯示一個(gè)登錄按鈕。”
這個(gè)簡單的陳述表明應(yīng)用程序很大程度上的編寫是為了滿足用戶的要求和需要。即使該“用戶”是另一個(gè)軟件系統(tǒng)而不是一個(gè)人類,你仍然得編寫代碼來響應(yīng)行為,基于當(dāng)前與你的軟件進(jìn)行交互的人或物。
Shiro在它自己的設(shè)計(jì)中體現(xiàn)了這些概念。通過匹配那些對(duì)于軟件開發(fā)人員來說已經(jīng)很直觀的東西,Apache Shiro幾乎在任何應(yīng)用程序保持了直觀和易用性。
在最高的概念層次,Shiro的架構(gòu)有3個(gè)主要的概念:Subject,SecurityManager 和 Realms。
下面的關(guān)系圖是關(guān)于這些組件是如何交互的高級(jí)概述,而且我們將會(huì)在下面討論每一個(gè)概念:
Subject
在我們的教程中已經(jīng)提到,Subject實(shí)質(zhì)上是一個(gè)當(dāng)前執(zhí)行用戶的特定的安全“視圖”。鑒于"User"一詞通常意味著一個(gè)人,而一個(gè)Subject可以是一個(gè)人,但它還可以代表第三方服務(wù),daemon account,cron job,或其他類似的任何東西——基本上是當(dāng)前正與軟件進(jìn)行交互的任何東西。
所有Subject實(shí)例都被綁定到(且這是必須的)一個(gè)SecurityManager上。當(dāng)你與一個(gè)Subject交互時(shí),那些交互作用轉(zhuǎn)化為與SecurityManager交互的特定subject的交互作用。
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安全操作。這反映在上面的基本流程圖。
Realms
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í)例的。
下圖展示了Shiro的核心架構(gòu)概念,緊跟其后的是每個(gè)的簡短總結(jié):
Subject(org.apache.shiro.subject.Subject)
當(dāng)前與軟件進(jìn)行交互的實(shí)體(用戶,第三方服務(wù),cron job,等等)的安全特定“視圖”。
SecurityManager(org.apache.shiro.mgt.SecurityManager)
如上所述,SecurityManager是Shiro架構(gòu)的心臟。它基本上是一個(gè)“保護(hù)傘”對(duì)象,協(xié)調(diào)其管理的組件以確保它們能夠一起順利的工作。它還管理每個(gè)應(yīng)用程序用戶的Shiro 的視圖,因此它知道如何執(zhí)行每個(gè)用戶的安全操作。
Authenticator(org.apache.shiro.authc.Authenticator)
Authenticator是一個(gè)對(duì)執(zhí)行及對(duì)用戶的身份驗(yàn)證(登錄)嘗試負(fù)責(zé)的組件。當(dāng)一個(gè)用戶嘗試登錄時(shí),該邏輯被 Authenticator執(zhí)行。Authenticator知道如何與一個(gè)或多個(gè)Realm協(xié)調(diào)來存儲(chǔ)相關(guān)的用戶/帳戶信息。從這些Realm中獲得的數(shù)據(jù)被用來驗(yàn)證用戶的身份來保證用戶確實(shí)是他們所說的他們是誰。
Authentication Strategy(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果不止一個(gè)Realm被配置,則AuthenticationStrategy將會(huì)協(xié)調(diào)這些Realm來決定身份認(rèn)證嘗試成功或失敗下的條件(例如,如果一個(gè)Realm成功,而其他的均失敗,是否該嘗試成功?是否所有的Realm必須成功?或只有第一個(gè)成功即可?)。
Authorizer(org.apache.shiro.authz.Authorizer)
Authorizer是負(fù)責(zé)在應(yīng)用程序中決定用戶的訪問控制的組件。它是一種最終判定用戶是否被允許做某事的機(jī)制。與 Authenticator相似,Authorizer也知道如何協(xié)調(diào)多個(gè)后臺(tái)數(shù)據(jù)源來訪問角色惡化權(quán)限信息。Authorizer使用該信息來準(zhǔn)確地決定用戶是否被允許執(zhí)行給定的動(dòng)作。
SessionManager(org.apache.shiro.session.SessionManager)
SessionManager知道如何去創(chuàng)建及管理用戶Session生命周期來為所有環(huán)境下的用戶提供一個(gè)強(qiáng)健的Session體驗(yàn)。這在安全框架界是一個(gè)獨(dú)有的特色——Shiro擁有能夠在任何環(huán)境下本地化管理用戶Session的能力,即使沒有可用的Web/Servlet或EJB容器,它將會(huì)使用它內(nèi)置的企業(yè)級(jí)會(huì)話管理來提供同樣的編程體驗(yàn)。SessionDAO的存在允許任何數(shù)據(jù)源能夠在持久會(huì)話中使用。
SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
SesssionDAO代表SessionManager執(zhí)行Session持久化(CRUD)操作。這允許任何數(shù)據(jù)存儲(chǔ)被插入到會(huì)話管理的基礎(chǔ)之中。
CacheManager(org.apahce.shiro.cache.CacheManager)
CacheManager創(chuàng)建并管理其他Shiro組件使用的Cache實(shí)例生命周期。因?yàn)镾hiro能夠訪問許多后臺(tái)數(shù)據(jù)源,由于身份驗(yàn)證,授權(quán)和會(huì)話管理,緩存在框架中一直是一流的架構(gòu)功能,用來在同時(shí)使用這些數(shù)據(jù)源時(shí)提高性能。任何現(xiàn)代開源和/或企業(yè)的緩存產(chǎn)品能夠被插入到Shiro來提供一個(gè)快速及高效的用戶體驗(yàn)。
Cryptography(org.apache.shiro.crypto.*)
Cryptography是對(duì)企業(yè)安全框架的一個(gè)很自然的補(bǔ)充。Shiro的crypto包包含量易于使用和理解的cryptographic Ciphers,Hasher(又名digests)以及不同的編碼器實(shí)現(xiàn)的代表。所有在這個(gè)包中的類都被精心地設(shè)計(jì)以易于使用和易于理解。任何使用Java的本地密碼支持的人都知道它可以是一個(gè)難以馴服的具有挑戰(zhàn)性的動(dòng)物。Shiro的cryptoAPI 簡化了復(fù)雜的Java機(jī)制,并使加密對(duì)于普通人也易于使用。
Realms(org.apache.shiro.realm.Realm)
如上所述,Realms在Shiro和你的應(yīng)用程序的安全數(shù)據(jù)之間擔(dān)當(dāng)“橋梁”或“連接器”。當(dāng)它實(shí)際上與安全相關(guān)的數(shù)據(jù)如用來執(zhí)行身份驗(yàn)證(登錄)及授權(quán)(訪問控制)的用戶帳戶交互時(shí),Shiro從一個(gè)或多個(gè)為應(yīng)用程序配置的Realm中尋找許多這樣的東西。你可以按你的需要配置多個(gè)Realm(通常一個(gè)數(shù)據(jù)源一個(gè)Realm),且Shiro將為身份驗(yàn)證和授權(quán)對(duì)它們進(jìn)行必要的協(xié)調(diào)。
The SecurityManager
因?yàn)镾hiro的API鼓勵(lì)一個(gè)以Subject為中心的編程方式,大多數(shù)應(yīng)用程序開發(fā)人員很少,如果真有,與SecurityManager直接進(jìn)行交互(框架開發(fā)人員有時(shí)候會(huì)覺得它很有用)。即便如此,了解如何SecurityManager是如何工作的仍然是很重要的,尤其是在為應(yīng)用程序配置一個(gè)SecurityManager的時(shí)候。
Design
如前所述,應(yīng)用程序的SecurityManager執(zhí)行安全操作并管理所有應(yīng)用程序用戶的狀態(tài)。在Shiro的默認(rèn)SecurityManager實(shí)現(xiàn)中,這包括:
-
Authentication
-
Authorization
-
Session Management
-
Cache Management
-
Realm coordination
-
Event propagation
-
"Remember Me" Services
-
Subject creation
-
Logout
以及更多。
但這是許多功能來嘗試管理一個(gè)單一的組件。而且,使這些東西靈活而又可定制將會(huì)是非常困難的,如果一切都集中到一個(gè)單一的實(shí)現(xiàn)類。
為了簡化配置并啟用靈活配置/可插性,Shiro的實(shí)現(xiàn)都是高度模塊化設(shè)計(jì)——由于如此的模塊化,SecurityManager實(shí)現(xiàn)(以及它的類層次結(jié)構(gòu))并沒有做很多事情。相反,SecurityManager 實(shí)現(xiàn)主要是作為一個(gè)輕量級(jí)的“容器”組件,委托計(jì)劃所有的行為到嵌套/包裹的組件。這種“包裝”的設(shè)計(jì)體現(xiàn)在上面的詳細(xì)構(gòu)架圖。
雖然組件實(shí)際上執(zhí)行邏輯,但SecurityManager實(shí)現(xiàn)知道何時(shí)以及如何協(xié)調(diào)組件來完成正確的行為。SecurityManager 實(shí)現(xiàn)和組件都是兼容JavaBean的,它允許你(或某個(gè)配置機(jī)制)通過標(biāo)準(zhǔn)的JavaBean的accessor/mutator 方法(get/set)輕松地自定義可拔插組件。這意味著 Shiro 的架構(gòu)的組件性能夠把自定義行為轉(zhuǎn)化為非常容易的配置文件。
Easy Configuration
由于JavaBeans的兼容性,通過任何支持JavaBean風(fēng)格的配置的機(jī)制可以很容易的用自定義組件配置SecurityManager,如 Spring,Guice,JBoss,等等。
轉(zhuǎn)載于:https://www.cnblogs.com/rinack/p/9950899.html
總結(jié)
以上是生活随笔為你收集整理的非常详尽的 Shiro 架构解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构期末复习(に)--链式栈定义及使
- 下一篇: Python基础(三)文件操作和处理js