Shiro 原

Shiro是什麼?

Apache Shiro是一個強大而靈活的開源安全框架,它乾淨利落地處理身份認證,授權,企業會話管理和加密。

Apache Shiro的首要目標是易於使用和理解。安全有時候是很複雜的,甚至是痛苦的,但它沒有必要這樣。框架應該儘可能掩蓋複雜的地方,露出一個乾淨而直觀的API,來簡化開發人員在使他們的應用程序安全上的努力。

官網:http://shiro.apache.org

Shiro有什麼用?

以下是你可以用Apache Shiro所做的事情:

  • 驗證用戶來覈實他們的身份

  • 對用戶執行訪問控制,如:

  1. 判斷用戶是否被分配了一個確定的安全角色;

  2. 判斷用戶是否被允許做某事;

  • 在任何環境下使用Session API,即使沒有Web或EJB容器。

  • 在身份驗證,訪問控制期間或在會話的生命週期,對事件作出反應。

  • 聚集一個或多個用戶安全數據的數據源,並作爲一個單一的複合用戶“視圖”。

  • 啓用單點登錄(SSO)功能。

  • 爲沒有關聯到登錄的用戶啓用"Remember Me"服務

  • 以及更多——全部集成到緊密結合的易於使用的API中。

Shiro 視圖在所有應用程序環境下實現這些目標——從最簡單的命令行應用程序到最大的企業應用,不強制依賴其他第三方框架,容器,或應用服務器。當然,該項目的目標是儘可能地融入到這些環境,但它能夠在任何環境下立即可用。

Shiro特性

Apache Shiro是一個擁有許多功能的綜合性的程序安全框架。

image

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的核心架構概念,緊跟其後的是每個的簡短總結:

image

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 的架構的組件性能夠把自定義行爲轉化爲非常容易的配置文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章