# 3. Architecture 架構
# 3. Architecture 架構
Apache Shiro 設計理念是使程序的安全變得簡單直觀而易于實現,Shiro的核心設計參照大多數用戶對安全的思考模式--如何對某人(或某事)在與程序交互的環境中的進行安全控制。
程序設計通常都以用戶故事為基礎,也就是說,你會經常設計用戶接口或服務api基于用戶如何(或應該)與軟件交互。 例如,你可能會說,“如果我的應用程序的用戶交互是登錄,我將展示他們可以單擊一個按鈕來查看他們的帳戶信息。 如果不登錄,我將展示一個注冊按鈕。”
這個陳述例子指出我們開發程序很大程度上是為了滿足用戶的需求,即使“用戶(User)”是另外一個軟件系統而并非一個人,你仍然要寫代碼對當前與你軟件交互的誰(或者什么)的動作進行回應。
Shiro 從它的設計中表現了這種理念,為了與軟件開發者的直覺相配合,Apache Shiro 在幾乎所有程序中保留了直觀和易用的特性。
## High-Level Overview 高級概述
在概念層,Shiro 架構包含三個主要的理念:Subject,SecurityManager和 Realm。下面的圖展示了這些組件如何相互作用,我們將在下面依次對其進行描述。

- **Subject**:就像我們在上一章示例中提到的那樣,Subject 本質上是當前運行用戶特定的'View'(視圖),而單詞“User”經常暗指一個人,Subject 可以是一個人,但也可以是第三方服務、守護進程帳戶、時鐘守護任務或者其它--當前和軟件交互的任何事件。 Subject 實例都和(也需要)一個 SecurityManager 綁定,當你和一個Subject 進行交互,這些交互動作被轉換成 SecurityManager 下Subject 特定的交互動作。
- **SecurityManager**: SecurityManager 是 Shiro 架構的核心,配合內部安全組件共同組成安全傘。然而,一旦一個程序配置好了SecurityManager 和它的內部對象,SecurityManager通常獨自留下來,程序開發人員幾乎花費的所有時間都集中在 Subjet API上。 我們將在以后詳細討論 SecurityManager,但當你和一個 Subject 互動時了解它是很重要的。任何 Subject 的安全操作中 SecurityManager 是幕后真正的舉重者,這在上面的圖表中可以反映出來。
- **Realms**: Reamls 是 Shiro 和你的程序安全數據之間的“橋”或者“連接”,它用來實際和安全相關的數據如用戶執行身份認證(登錄)的帳號和授權(訪問控制)進行交互,Shiro 從一個或多個程序配置的 Realm 中查找這些東西。 Realm 本質上是一個特定的安全 [DAO](http://en.wikipedia.org/wiki/Data_access_object):它封裝與數據源連接的細節,得到Shiro 所需的相關的數據。在配置 Shiro 的時候,你必須指定至少一個Realm 來實現認證(authentication)和/或授權(authorization)。SecurityManager 可以配置多個復雜的 Realm,但是至少有一個是需要的。 Shiro 提供開箱即用的 Realms 來連接安全數據源(或叫地址)如 LDAP、JDBC、文件配置如INI和屬性文件等,如果已有的Realm不能滿足你的需求你也可以開發自己的Realm實現。 和其它內部組件一樣,Shiro SecurityManager 管理如何使用 Realms獲取 Subject 實例所代表的安全和身份信息。
## Detailed Architecture 詳細架構
下面的圖表展示了 Shiro 的核心架構思想,下面有簡單的解釋。

- **Subject** ([org.apache.shiro.subject.Subject](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/subject/Subject.html))
正在與軟件交互的一個特定的實體“view”(用戶、第三方服務、時鐘守護任務等)。
- **SecurityManager** ([org.apache.shiro.mgt.SecurityManager](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/mgt/SecurityManager.html))
如同上面提到的,SecurityManager 是 Shiro 的核心,它基本上就是一把“保護傘”用來協調它管理的組件使之平穩地一起工作,它也管理著 Shiro 中每一個程序用戶的視圖,所以它知道每個用戶如何執行安全操作。
- **Authenticator**([org.apache.shiro.authc.Authenticator](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/Authenticator.html))
Authenticator 是一個組件,負責執行和反饋用戶的認證(登錄),如果一個用戶嘗試登錄,Authenticator 就開始執行。Authenticator 知道如何協調一個或多個保存有相關用戶/帳號信息的 Realm,從這些 Realm中獲取這些數據來驗證用戶的身份以確保用戶確實是其表述的那個人。
- **Authentication Strategy**([org.apache.shiro.authc.pam.AuthenticationStrategy](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/pam/AuthenticationStrategy.html))
如果配置了多個 Realm,AuthenticationStrategy 將會協調 Realm 確定在一個身份驗證成功或失敗的條件(例如,如果在一個方面驗證成功了但其他失敗了,這次嘗試是成功的嗎?是不是需要所有方面的驗證都成功?還是只需要第一個?)
- **Authorizer**([org.apache.shiro.authz.Authorizer](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/Authorizer.html))
Authorizer 是負責程序中用戶訪問控制的組件,它是最終判斷一個用戶是否允許做某件事的途徑,像 Authenticator 一樣,Authorizer 也知道如何通過協調多種后臺數據源來訪問角色和權限信息,Authorizer 利用這些信息來準確判斷一個用戶是否可以執行給定的動作。
- **SessionManager**([org.apache.shiro.session.mgt.SessionManager](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/Authorizer.html))
SessionManager 知道如何創建并管理用戶 Session 生命周期而在所有環境中為用戶提供一個強有力的 Session 體驗。這在安全框架領域是獨一無二--Shiro 具備管理在任何環境下管理用戶 Session 的能力,即使沒有 Web/Servlet 或者 EJB 容器。默認情況下,Shiro 將使用現有的session(如Servlet Container),但如果環境中沒有,比如在一個獨立的程序或非 web 環境中,它將使用它自己建立的 session 提供相同的作用,sessionDAO 用來使用任何數據源使 session 持久化。
- **SessionDAO**([org.apache.shiro.session.mgt.eis.SessionDAO](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/session/mgt/eis/SessionDAO.html))
SessionDAO 代表 SessionManager 執行 Session 持久(CRUD)動作,它允許任何存儲的數據掛接到 session 管理基礎上。
- **CacheManager**([org.apache.shiro.cache.CacheManager](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/cache/CacheManager.html))
CacheManager 為 Shiro 的其他組件提供創建緩存實例和管理緩存生命周期的功能。因為 Shiro 的認證、授權、會話管理支持多種數據源,所以訪問數據源時,使用緩存來提高訪問效率是上乘的選擇。當下主流開源或企業級緩存框架都可以繼承到 Shiro 中,來獲取更快更高效的用戶體驗。
- **Cryptography** ([org.apache.shiro.crypto.\*](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/crypto/package-summary.html))
Cryptography 在安全框架中是一個自然的附加產物,Shiro 的 crypto 包包含了易用且易懂的加密方式,Hashes(即digests)和不同的編碼實現。該包里所有的類都亦于理解和使用,曾經用過 Java 自身的加密支持的人都知道那是一個具有挑戰性的工作,而 Shiro 的加密 API 簡化了 java 復雜的工作方式,將加密變得易用。
- **Realms** ([org.apache.shiro.realm.Realm](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/realm/Realm.html))
如同上面提到的,Realm 是 shiro 和你的應用程序安全數據之間的“橋”或“連接”,當實際要與安全相關的數據進行交互如用戶執行身份認證(登錄)和授權驗證(訪問控制)時,shiro 從程序配置的一個或多個Realm 中查找這些數據,你需要配置多少個 Realm 便可配置多少個 Realm(通常一個數據源一個),shiro 將會在認證和授權中協調它們。
## SecurityManager
因為 Shiro API 鼓勵以 Subject 為中心的開發方式,大部分開發人員將很少會和 SecurityManager 直接交互(盡管框架開發人員也許發現它非常有用),盡管如此,知道 SecurityManager 如何工作,特別是當在一個程序中進行配置的時候,是非常重要的。
## Design 設計
如前所述,程序中 SecurityManager 執行操作并且管理所有程序用戶的狀態,在 Shiro 基礎的 SecurityManager 實現中,包含以下內容:
- 認證(Authentication)
- 授權(Authorization)
- 會話管理(Session Management)
- 緩存管理(Cache Management)
- Realm協調(Realm coordination)
- 事件傳導(Event propagation )
- "RememberMe" 服務("Remember Me" Services)
- 建立Subject(Subject creation)
- 退出登錄(Logout)
及其它。
但這些功能都在一個單獨的組件中管理,并且,當所有功能集中在一個類中實現是靈活和可定制是非常困難的。
為了實現配置的簡單、靈活、可插拔,Shiro在設計時實現了高模塊化--盡管模塊化,SecurityManager(包括它的繼承類)并沒有做到,相反地,SecurityManager實現更像一個輕量級的‘容器(container)’,代表幾乎所有嵌套/封裝組件的行為,這種‘封裝(wrapper)’設計在上面的架構圖表中已有反映。
當組件執行邏輯的時候,SecurityManager 知道如何以及何時去協調組件做出正確的動作。
SecurityManager 和 JavaBean 兼容,這允許你(或者配置途徑)通過標準的J avaBean 訪問/設置方法(get*/set*)很容易地定制插件,這意味著 Shiro 模塊可以根據用戶行為轉化成簡易的配置。
*簡易的配置*
*因為適合JavaBean,任何支持Javabean配置的組件都有非常簡單的途徑配置 SecurityManager,如 Spring、Guice、JBoss,等等。*
我們將在下一節討論配置([Configuration](4.%20Configuration%20%E9%85%8D%E7%BD%AE.md) )
## 為文檔加把手
我們希望這篇文檔可以幫助你使用 Apache Shiro 進行工作,社區一直在不斷地完善和擴展文檔,如果你希望幫助 Shiro 項目,請在你認為需要的地方考慮更正、擴展或添加文檔,你提供的任何點滴幫助都將擴充社區并且提升 Shiro。
提供你的文檔的最簡單的途徑是將它發送到用戶[論壇](http://shiro-user.582556.n2.nabble.com/)或[郵件列表](http://shiro.apache.org/mailing-lists.html)
*譯者注:*如果對本中文翻譯有疑議的或發現勘誤歡迎指正,[點此](https://github.com/waylau/apache-shiro-1.2.x-reference/issues)提問。
- Introduction
- 1. Introduction 介紹
- 2. Tutorial 教程
- 3. Architecture 架構
- 4. Configuration 配置
- 5. Authentication 認證
- 6. Authorization 授權
- 6.1. Permissions 權限
- 7. Realms
- 8. Session Management
- 9. Cryptography 密碼
- 10. Web
- 10.1. Configuration 配置
- 10.2. 基于路徑的 url 安全
- 10.3. Default Filters 默認過濾器
- 10.4. Session Management
- 10.5. JSP Tag Library
- 11. Caching 緩存
- 12. Concurrency & Multithreading 并發與多線程
- 13. Testing 測試
- 14. Custom Subjects 自定義 Subject
- 15. Spring Framework
- 16. Guice
- 17. CAS
- 18. Command Line Hasher
- 19. Terminology 術語
- 20. 10 Minute Tutorial 十分鐘教程
- 21. Beginner's Webapp Tutorial 初學者web應用教程
- 22. Application Security With Apache Shiro 用Shiro保護你的應用安全
- 23. CacheManager 緩存管理
- 24. Apache Shiro Cryptography Features 加密功能