[翻譯-Shiro]-Apache Shiro 框架解析
譯者:劉曉日
Apache Shiro設計理念是用直觀、簡單的方式來保證應用的安全。
軟體設計通常是基於使用者故事來實現的,也就是會根據使用者如何與系統互動來設計使用者介面或者服務API。比如這樣一個使用者故事,使用者登入後會顯示一個檢視個人賬戶資訊的按鈕,如果使用者未註冊,則顯示一個註冊按鈕。
這個使用者故事暗含了應用主要應完成的使用者需求。即使這裡的使用者不是人而是第三方系統,在編碼時也同樣當做與系統互動的“使用者”來處理。
Apache Shiro的這種理念反應在自己的設計中,通過將直觀的概念暴露給開發人員,使得Apache Shiro在幾乎所有的應用中都易於使用。
概述
Shiro有三個主要的頂級概念:Subject、SecurityManager、Realms。下圖描述了這幾個概念之間的互動,下面也將一一做介紹。
- Subject:Subject是當前使用者在安全領域的一個縮影。User通常暗含人的意思,而Subject可以是人,可以是第三方服務,守護賬戶,corn作業。或者說是任何與系統互動的都可以叫做Subject。 所有的Subject例項都必須繫結到一個SecurityManager,這樣當與Subject互動時,其實已經轉化成與這個Subject相關聯的SecurityManager進行互動。
- SecurityManager:SecurityManager作為Shiro框架的核心,作為“保護傘”物件的形式存在,它協調其內部安全元件形成一個物件圖。當在應用中完成SecurityManager和其內部物件的配置後,SecurityManager就退居二線,開發人員大部分時間都是在使用Subject的API。 隨後會深入講解SecurityManager,再次強調:當與Subject互動時,實際上是隱藏其背後的SecurityManager負責Subject繁重的安全操作。這點在上面的圖中也有所體現。
- Realms:Realms作為Shiro和應用中安全資料來源之間的橋樑或者聯結器。當需要獲取使用者賬戶進行認證(登陸)或授權(訪問控制)時,Shiro就會在應用的配置中查詢負責這項工作的Realm(一個或多個)來完成獲取安全資料。 從這點上講,Realm實質上就是一個與安全相關的Dao:它封裝了資料來源連結的詳情,並根據Shiro的需要為其提供資料。配置Shiro時,要為認證和授權至少提供一個Reaml。可配置多個Realm,但是至少需要一個。 Shiro內建了可以連線大量安全資料來源的Realm,如LDAP、關聯式資料庫(JDBC)、類似INI的文字配置資源以及屬性檔案等。如果內建的Realm不能滿足需求,你還可以使用代表自定義資料來源的自己的Realm實現。 和其他內部元件一樣,SecurityManager管理Realm如何獲取與Subject相關的安全和身份資訊。
框架詳解
下圖展現了Shiro框架的核心概念,隨後會一一對其作出簡短說明:
Subject(org.apache.shiro.subject.Subject )
安全領域中使用者的縮影,可以是人,第三方服務,corn作業等,負責與系統互動。
SecurityManager(org.apache.shiro.mgt.SecurityManager)
就像上文提到的,SecurityManager是Shiro框架的核心。它充當“保護傘”物件的作用,內部協調各個元件,以確保它們順利開展工作,而且還負責管理Subject,這樣它也就獲悉了每個Subject怎麼執行安全操作了。
Authenticator(org.apache.shiro.authc.Authenticator)
Authenticator負責發出和處理使用者的認證請求。當使用者登入時,Authenticator負責處理登入邏輯。Authenticator可通過一個或多個Realm獲取使用者資訊,這些資訊用來驗證當前使用者身份。
驗證策略(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果配置了多個Realm,就需要AuthenticationStrategy協調Realms來決定在什麼樣的情況下一個認證的是成功的或失敗的。(比如,一個realm認證成功,其他失敗,那認證是否通過呢?)
Authorizer (org.apache.shiro.authz.Authorizer)
Authorizer負責應用中使用者的訪問控制。它是決定使用者是否可以在應用中進行某件事的機制。和Authenticator一樣,Authorizer可以通過Realm獲取角色和許可權資訊,這樣Authorizer就可以確切的知道是否允許使用者完成其預期的操作。
SessionManager (org.apache.shiro.session.mgt.SessionManager)
SessionManager用來建立和管理使用者Session的生命週期,在任何應用環境下,都可以為使用者提供穩定的Session。Shiro可以在任何應用環境下管理使用者Session,不需要依附於WEB/Servlet或者EJB容器,這個特性在安全框架領域是唯一的。比如在Servlet容器環境下,預設使用容器自帶的Session,如果像在獨立應用或非web容器環境下,根本就沒有session的存在,那麼Shiro使用其內建的企業會話管理器提供同樣的程式設計體驗。SessionDao的存在使得任何資料來源都可以用來持久session。
SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO)
SessionDao為SecurityManager提供會話持久(CRUD)功能,這樣就可讓任何資料來源參與到會話管理基礎設施中來。
CacheManager (org.apache.shiro.cache.CacheManager)
CacheManager為Shiro的其他元件提供建立快取例項和管理快取生命週期的功能。因為Shiro的認證、授權、會話管理支援多種資料來源,所以訪問資料來源時,使用快取來提高訪問效率是上乘的選擇。當下主流開源或企業級快取框架都可以繼承到Shiro中,來獲取更快更高效的使用者體驗。
Cryptography (org.apache.shiro.crypto.*)
Cryptography是企業級安全框架基本特徵。Shiro的加密包中,包含了易於使用和理解的密碼加密,雜湊和其他不同加密演算法的實現。加密包下面的所有類都是經過精心設計的,來達到易於使用和理解的目的,之前使用過Java自帶的加密API的會了解到,它是很難使用的。Shiro的加密API簡化了Java複雜的加密機制,而且很容易使用。
Realms(org.apache.shiro.realm.Realm)
上文中也提到過,Realms作為Shiro和應用中安全資料來源之間的橋樑或者聯結器。當需要獲取使用者賬戶進行認證(登陸)或授權(訪問控制)時,Shiro就會在應用的配置中查詢負責這項工作的Realm(一個或多個)來完成獲取安全資料。可以配置多個Realm,大多情況是一個資料來源一個Realm,Shiro會負責為認證和授權協調多個Realm一同工作。
SecurityManager簡介
由於Shiro採用以Subject為中心的程式設計方式,所以幾乎很少有機會直接與SecurityManager打交道(但與SecurityManager打交道對框架開發人員很重要),儘管如此,瞭解SecurityManager的作用也還是很重要的,為應用配置SecurityManager的時候尤為重要。
設計
如上文所述,SecurityManager負責處理應用中的安全操作,管理所有應用使用者的狀態。Shiro中SecurityManager的預設實現包括如下:
- Authentication
- Authorization
- Session Management
- Cache Management
- Realm coordination
- Event propagation
- "Remember Me" Services
- Subject creation
- Logout
等等。
但是讓一個元件完成這麼多功能,而且做到靈活可定製是非常困難的。為了簡化配置和使配置更靈活,Shiro的各種實現採用了高度的模組化。模組化之後,SecurityManager實際上就作為一個輕量級“容器”,幾乎所有的功能都委託給內部或包裝元件實現。這種包裝的設計方法在詳細的框架圖中也有所體現。
這些元件才是真正的功能實現者,SecurityManager知道如何以及何時協調這些元件做正確的事情即可。
相關文章
- [翻譯-Shiro]-Apache Shiro 簡介Apache
- [翻譯-Shiro]-Apache Shiro Java認證指南ApacheJava
- [翻譯-Shiro]-Apache Shiro Java 授權指南ApacheJava
- [翻譯-Shiro]-Apache Shiro Java註解列表ApacheJava
- [翻譯-Shiro]-10分鐘教會你Apache ShiroApache
- [翻譯-Shiro]-Apache Shiro JSP/GSP標籤庫ApacheJS
- [翻譯-Shiro]-整合Apache Shiro到基於Spring的應用ApacheSpring
- Apache Shiro 快速入門教程,shiro 基礎教程Apache
- Spring MVC 中使用 Apache Shiro 安全框架詳解SpringMVCApache框架
- 基於spring框架的apache shiro簡單整合Spring框架Apache
- org.apache.shiro.authc.UsernamePasswordTokenApache
- Shiro許可權管理框架(一):Shiro的基本使用框架
- 關於shiro安全框架和shiro的認證流程框架
- web開發安全框架中的Apache Shiro的應用Web框架Apache
- Shiro許可權框架框架
- shiro org.apache.shiro.session.mgt.SimpleSession物件 反序列化失敗ApacheSession物件
- Apache Shiro 反序列化漏洞分析Apache
- Apache Shiro 550反序列化漏洞Apache
- [譯] 用 Apache Shiro 來保護一個 Spring Boot 應用ApacheSpring Boot
- shiro教程(2): shiro介紹
- Shiro報錯-[org.apache.shiro.mgt.AbstractRememberMeManager] - There was a failure while trying to retrieve remembered principals.ApacheREMAIWhile
- 【Shiro】4.Springboot整合ShiroSpring Boot
- 許可權框架之Shiro詳解框架
- Shiro 教程
- Shiro【授權、整合Spirng、Shiro過濾器】過濾器
- Shiro系列教程之一Shiro簡介
- Spring Boot:整合Shiro許可權框架Spring Boot框架
- 學習springBoot(11)shiro安全框架Spring Boot框架
- java反序列化——apache-shiro復現分析JavaApache
- shiro 整合MybatisMyBatis
- shiro面試題面試題
- 【shiro】11.shiro過濾器鑑權setFilterChainDefinitionMap過濾器FilterAI
- spring boot 框架spring date jpa整合shiroSpring Boot框架
- 適合才最美:Shiro安全框架使用心得框架
- Shiro原理解析(三)--再談過濾器過濾器
- Shiro許可權管理框架(二):Shiro結合Redis實現分散式環境下的Session共享框架Redis分散式Session
- shiro remembeMe 原理分析REM
- spring-shiroSpring