[翻譯-Shiro]-Apache Shiro 框架解析

劉曉日發表於2011-10-11

譯者:劉曉日

Apache Shiro設計理念是用直觀、簡單的方式來保證應用的安全。

軟體設計通常是基於使用者故事來實現的,也就是會根據使用者如何與系統互動來設計使用者介面或者服務API。比如這樣一個使用者故事,使用者登入後會顯示一個檢視個人賬戶資訊的按鈕,如果使用者未註冊,則顯示一個註冊按鈕。

這個使用者故事暗含了應用主要應完成的使用者需求。即使這裡的使用者不是人而是第三方系統,在編碼時也同樣當做與系統互動的“使用者”來處理。

Apache Shiro的這種理念反應在自己的設計中,通過將直觀的概念暴露給開發人員,使得Apache Shiro在幾乎所有的應用中都易於使用。

概述

Shiro有三個主要的頂級概念:Subject、SecurityManager、Realms。下圖描述了這幾個概念之間的互動,下面也將一一做介紹。

enter image description here

  • 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框架的核心概念,隨後會一一對其作出簡短說明:

enter image description here

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知道如何以及何時協調這些元件做正確的事情即可。

原文連結:http://shiro.apache.org/architecture.html

相關文章