
Shiro是什么?
Apache Shiro是一個強大而靈活的開源安全框架,它干凈利落地處理身份認證,授權,企業會話管理和加密,
Apache Shiro的首要目標是易于使用和理解,安全有時候是很復雜的,甚至是痛苦的,但它沒有必要這樣,框架應該盡可能掩蓋復雜的地方,露出一個干凈而直觀的API,來簡化開發人員在使他們的應用程式安全上的努力,
官網:http://shiro.apache.org
Shiro有什么用?
以下是你可以用Apache Shiro所做的事情:
-
驗證用戶來核實他們的身份
-
對用戶執行訪問控制,如:
-
判斷用戶是否被分配了一個確定的安全角色;
-
判斷用戶是否被允許做某事;
-
在任何環境下使用Session API,即使沒有Web或EJB容器,
-
在身份驗證,訪問控制期間或在會話的生命周期,對事件作出反應,
-
聚集一個或多個用戶安全資料的資料源,并作為一個單一的復合用戶“視圖”,
-
啟用單點登錄(SSO)功能,
-
為沒有關聯到登錄的用戶啟用"Remember Me"服務
-
以及更多——全部集成到緊密結合的易于使用的API中,
Shiro 視圖在所有應用程式環境下實作這些目標——從最簡單的命令列應用程式到最大的企業應用,不強制依賴其
他第三方框架,容器,或應用服務器,當然,該專案的目標是盡可能地融入到這些環境,但它能夠在任何環境下立
即可用,
Shiro特性
Apache Shiro是一個擁有許多功能的綜合性的程式安全框架,

Shiro把Shiro開發團隊稱為“應用程式的四大基石”——身份驗證,授權,會話管理和加密作為其目標,
-
Authentication:有時也簡稱為“登錄”,這是一個證明用戶是他們所說的他們是誰的行為,
-
Authorization:訪問控制的程序,也就是絕對“誰”去訪問“什么”,
-
Session Management:管理用戶特定的會話,即使在非 Web 或 EJB 應用程式,
-
Cryptography:通過使用加密演算法保持資料安全同時易于使用,
也提供了額外的功能來支持和加強在不同環境下所關注的方面,尤其是以下這些:
-
Web Support:Shiro的web支持的API能夠輕松地幫助保護 Web 應用程式,
-
Caching:快取是Apache Shiro中的第一層公民,來確保安全操作快速而又高效,
-
Concurrency:Apache Shiro利用它的并發特性來支持多執行緒應用程式,
-
Testing:測驗支持的存在來幫助你撰寫單元測驗和集成測驗,并確保你的能夠如預期的一樣安全,
-
"Run As":一個允許用戶假設為另一個用戶身份(如果允許)的功能,有時候在管理腳本很有用,
-
"Remember Me":在會話中記住用戶的身份,所以他們只需要在強制時候登錄,
Shiro 架構
Apache Shiro的設計目標是通過直觀和易于使用來簡化應用程式安全,Shiro 的核心設計體現了大多數人們是如何考
慮應用程式安全的——在某些人(或某些事)與應用程式互動的背景下,
應用軟體通常是基于用戶背景情況設計的,也就是說,你將經常設計用戶介面或服務API,基于一個用戶將要(或應該)如何與該軟體互動,例如,你可能會說,“如果用戶與我的應用程式互動的用戶已經登錄,我將顯示一個他們能夠點擊的按鈕來查看他們的帳戶資訊,如果他們沒有登錄,我將顯示一個登錄按鈕,”
這個簡單的陳述表明應用程式很大程度上的撰寫是為了滿足用戶的要求和需要,即使該“用戶”是另一個軟體系統而不是一個人類,你仍然得撰寫代碼來回應行為,基于當前與你的軟體進行互動的人或物,
Shiro在它自己的設計中體現了這些概念,通過匹配那些對于軟體開發人員來說已經很直觀的東西,Apache Shiro幾
乎在任何應用程式保持了直觀和易用性,
在最高的概念層次,Shiro的架構有3個主要的概念:Subject,SecurityManager 和 Realms,
下面的關系圖是關于這
些組件是如何互動的高級概述,而且我們將會在下面討論每一個概念:

- Subject
在我們的教程中已經提到,Subject實質上是一個當前執行用戶的特定的安全“視圖”,鑒于"User"一詞通常意味著一個人,而一個Subject可以是一個人,但它還可以代表第三方服務,daemon account,cron job,或其他類似的任何東西——基本上是當前正與軟體進行互動的任何東西,
所有Subject實體都被系結到(且這是必須的)一個SecurityManager上,當你與一個Subject互動時,那些互動作用轉化為與SecurityManager互動的特定subject的互動作用,
- SecurityManager
SecurityManager是Shiro架構的心臟,并作為一種“保護傘”物件來協調內部的安全組件共同構成一個物件圖,然而,一旦SecurityManager和它的內置物件圖已經配置給一個應用程式,那么它單獨留下來,且應用程式開發人員幾乎使用他們所有的時間來處理Subject API,
稍后會更詳細地討論SecurityManager,但重要的是要認識到,當你正與一個Subject進行互動時,實質上是幕后的 SecurityManager處理所有繁重的Subject安全操作,這反映在上面的基本流程圖,
- Realms
Realms擔當Shiro和你的應用程式的安全資料之間的“橋梁”或“連接器”,當它實際上與安全相關的資料如用來執行身份驗證(登錄)及授權(訪問控制)的用戶帳戶互動時,Shiro 從一個或多個為應用程式配置的Realm中尋找許多這樣的東西,
在這個意義上說,Realm本質上是一個特定安全的DAO:它封裝了資料源的連接詳細資訊,使Shiro所需的相關的資料可用,當配置Shiro時,你必須指定至少一個Realm用來進行身份驗證和/或授權,SecurityManager可能配置多個Realms,但至少有一個是必須的,
Shiro提供了立即可用的Realms來連接一些安全資料源(即目錄),如LDAP,關系資料庫(JDBC),文本配置源,像 INI 及屬性檔案,以及更多,你可以插入你自己的Realm 實作來代表自定義的資料源,如果默認地Realm不符合你的需求,
像其他內置組件一樣,Shiro SecurityManager控制 Realms是如何被用來獲取安全和身份資料來代表 Subject 實體的,
下圖展示了Shiro的核心架構概念,緊跟其后的是每個的簡短總結:

- Subject(org.apache.shiro.subject.Subject)
當前與軟體進行互動的物體(用戶,第三方服務,cron job,等等)的安全特定“視圖”,
- SecurityManager(org.apache.shiro.mgt.SecurityManager)
如上所述,SecurityManager是Shiro架構的心臟,它基本上是一個“保護傘”物件,協調其管理的組件以確保它們能夠一起順利的作業,它還管理每個應用程式用戶的Shiro 的視圖,因此它知道如何執行每個用戶的安全操作,
- Authenticator(org.apache.shiro.authc.Authenticator)
Authenticator是一個對執行及對用戶的身份驗證(登錄)嘗試負責的組件,當一個用戶嘗試登錄時,該邏輯被 Authenticator執行,Authenticator知道如何與一個或多個Realm協調來存盤相關的用戶/帳戶資訊,從這些Realm中獲得的資料被用來驗證用戶的身份來保證用戶確實是他們所說的他們是誰,
- Authentication Strategy(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果不止一個Realm被配置,則AuthenticationStrategy將會協調這些Realm來決定身份認證嘗試成功或失敗下的條件(例如,如果一個Realm成功,而其他的均失敗,是否該嘗試成功?是否所有的Realm必須成功?或只有第一個成功即可?),
- Authorizer(org.apache.shiro.authz.Authorizer)
Authorizer是負責在應用程式中決定用戶的訪問控制的組件,它是一種最終判定用戶是否被允許做某事的機制,與 Authenticator相似,Authorizer也知道如何協調多個后臺資料源來訪問角色惡化權限資訊,Authorizer使用該資訊來準確地決定用戶是否被允許執行給定的動作,
- SessionManager(org.apache.shiro.session.SessionManager)
SessionManager知道如何去創建及管理用戶Session生命周期來為所有環境下的用戶提供一個強健的Session體驗,這在安全框架界是一個獨有的特色——Shiro擁有能夠在任何環境下本地化管理用戶Session的能力,即使沒有可用的Web/Servlet或EJB容器,它將會使用它內置的企業級會話管理來提供同樣的編程體驗,SessionDAO的存在允許任何資料源能夠在持久會話中使用,
- SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
SesssionDAO代表SessionManager執行Session持久化(CRUD)操作,這允許任何資料存盤被插入到會話管理的基礎之中,
- CacheManager(org.apahce.shiro.cache.CacheManager)
CacheManager創建并管理其他Shiro組件使用的Cache實體生命周期,因為Shiro能夠訪問許多后臺資料源,由于身份驗證,授權和會話管理,快取在框架中一直是一流的架構功能,用來在同時使用這些資料源時提高性能,任何現代開源和/或企業的快取產品能夠被插入到Shiro來提供一個快速及高效的用戶體驗,
- Cryptography(org.apache.shiro.crypto.*)
Cryptography是對企業安全框架的一個很自然的補充,Shiro的crypto包包含量易于使用和理解的cryptographic Ciphers,Hasher(又名digests)以及不同的編碼器實作的代表,所有在這個包中的類都被精心地設計以易于使用和易于理解,任何使用Java的本地密碼支持的人都知道它可以是一個難以馴服的具有挑戰性的動物,Shiro的cryptoAPI 簡化了復雜的Java機制,并使加密對于普通人也易于使用,
- Realms(org.apache.shiro.realm.Realm)
如上所述,Realms在Shiro和你的應用程式的安全資料之間擔當“橋梁”或“連接器”,當它實際上與安全相關的資料如用來執行身份驗證(登錄)及授權(訪問控制)的用戶帳戶互動時,Shiro從一個或多個為應用程式配置的Realm中尋找許多這樣的東西,你可以按你的需要配置多個Realm(通常一個資料源一個Realm),且Shiro將為身份驗證和授權對它們進行必要的協調,
The SecurityManager
因為Shiro的API鼓勵一個以Subject為中心的編程方式,大多數應用程式開發人員很少,如果真有,與SecurityManager直接進行互動(框架開發人員有時候會覺得它很有用),即便如此,了解如何SecurityManager是如何作業的仍然是很重要的,尤其是在為應用程式配置一個SecurityManager的時候,
Design
如前所述,應用程式的SecurityManager執行安全操作并管理所有應用程式用戶的狀態,在Shiro的默認SecurityManager實作中,這包括:
-
Authentication
-
Authorization
-
Session Management
-
Cache Management
-
Realm coordination
-
Event propagation
-
"Remember Me" Services
-
Subject creation
-
Logout
以及更多,
但這是許多功能來嘗試管理一個單一的組件,而且,使這些東西靈活而又可定制將會是非常困難的,如果一切都集
中到一個單一的實作類,
為了簡化配置并啟用靈活配置/可插性,Shiro的實作都是高度模塊化設計——由于如此的模塊化,SecurityManager實作(以及它的類層次結構)并沒有做很多事情,相反,SecurityManager 實作主要是作為一個輕量級的“容器”組
件,委托計劃所有的行為到嵌套/包裹的組件,這種“包裝”的設計體現在上面的詳細構架圖,
雖然組件實際上執行邏輯,但SecurityManager實作知道何時以及如何協調組件來完成正確的行為,SecurityManager 實作和組件都是兼容JavaBean的,它允許你(或某個配置機制)通過標準的JavaBean的accessor/mutator 方法(get/set)輕松地自定義可拔插組件,這意味著 Shiro 的架構的組件性能夠把自定義行為轉化為非常容易的組態檔,
Easy Configuration
由于JavaBeans的兼容性,通過任何支持JavaBean風格的配置的機制可以很容易的用自定義組件配置SecurityManager,如 Spring,Guice,JBoss,等等,
本文摘自:《Apache Shiro 開發手冊》
整編:Java技術堆疊(公眾號id: javastack)
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/161501.html
標籤:Java
上一篇:多型
下一篇:最大公約數和最小公倍數
