天天看點

Apache Shiro ⒈基本概念ArchitectureDetailed Architecture

本篇為 Apache Shiro 的概述 (持續完善), 開始 Apache Shiro 的系列.

版本: 1.7.1

Reference: https://shiro.apache.org/introduction.html#introduction-to-apache-shiro

文章目錄

  • Architecture
  • Detailed Architecture

Shiro 着眼于其開發團隊認為的現代應用程式安全的 4 塊基石: 認證 (Authentication), 授權 (Authorization), 會話管理 (Session Manager) 和 加密 (Cryptography):

  • Authentication: 身份認證 / 登入. 驗證使用者是不是擁有相應的身份;
  • Authorization: 通路控制, 授權, 即權限驗證. 驗證某個已認證的使用者是否擁有某個權限; 即判斷使用者是否能做事情, 常見的如; 驗證某個使用者是否擁有某個角色. 或者細粒度的驗證某個使用者對某個資源是否具有某個權限;
  • Session Manager: 會話管理, 即使用者登入後就是一次會話, 在沒有退出之前, 它的所有資訊都在會話中; 會話可以是普通 JavaSE 環境的, 也可以是如 Web 環境的;
  • Cryptography: 加密, 保護資料的安全性, 如密碼加密存儲到資料庫, 而不是明文存儲;
    Apache Shiro ⒈基本概念ArchitectureDetailed Architecture
    一些其他特性:
  • Web Support: Web 支援, 可以非常容易的內建到 Web 環境;
  • Caching: 緩存, 比如使用者登入後, 其使用者資訊, 擁有的角色 / 權限不必每次去查, 這樣可以提高效率;
  • Concurrency: Shiro 支援多線程應用的并發驗證, 即如在一個線程中開啟另一個線程, 能把權限自動傳播過去;
  • Testing: 提供測試支援;
  • Run As: 允許一個使用者假裝為另一個使用者 (如果他們允許) 的身份進行通路;
  • Remember Me: 記住我, 這個是非常常見的功能, 即一次登入後, 下次再來的話不用登入了;

Architecture

總的來說, Shiro 有 3 個最核心的概念: Subject, SecurityManager 和 Realm. 下圖展示了他們之前如何互動以及使用者代碼如何接入:

Apache Shiro ⒈基本概念ArchitectureDetailed Architecture

可以看到: 應用代碼直接互動的對象是 Subject, 也就是說 Shiro 的對外 API 核心就是 Subject;

其每個 API 的含義:

  • Subject: 主體,代表了目前 “使用者”, 這個使用者不一定是一個具體的人, 與目前應用互動的任何東西都是 Subject, 如網絡爬蟲, 機器人等, 即一個抽象概念; 所有 Subject 都綁定到 SecurityManager, 與 Subject 的所有互動都會委托給 SecurityManager; 可以把 Subject 認為是一個門面; SecurityManager 才是實際的執行者;
  • SecurityManager:安全管理器; 即所有與安全有關的操作都會與 SecurityManager 互動; 它管理着所有 Subject; 是 Shiro 的核心, 負責與後邊介紹的其他元件進行互動;
  • Realm:充當 Shiro 和 應用程式的私密資料間的 “橋梁” 的角色. 域. Shiro 從 Realm 擷取安全資料 (如使用者, 角色, 權限), 就是說 SecurityManager 要驗證使用者身份, 那麼它需要從 Realm 擷取相應的使用者進行比較以确定使用者身份是否合法; 也需要從 Realm 得到使用者相應的角色 / 權限進行驗證使用者是否能進行操作; 可以把 Realm 看成 DataSource, 即安全資料源;

對我們而言, 一個最簡單的 Shiro 應用:

  1. 應用代碼通過 Subject 來進行認證和授權, 而 Subject 又委托給 SecurityManager;
  2. 我們需要給 Shiro 的 SecurityManager 注入 Realm, 進而讓 SecurityManager 能得到合法的使用者及其權限進行判斷.

    從以上也可以看出, Shiro 不提供維護使用者 / 權限, 而是通過 Realm 讓開發人員自己注入.

Detailed Architecture

Reference: https://shiro.apache.org/architecture.html#detailed-architecture

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-UfekG8Fs-1623900841970)(./material/shiro-architecture.png)]

  • Subject (

    org.apache.shiro.subject.Subject

    ): 主體, 可以看到主體可以是任何可以與應用互動的 “使用者”;
  • SecurityManager (org.apache.shiro.mgt.SecurityManager): 是 Shiro 的核心元件; 所有具體的互動都通過 SecurityManager 進行控制; 它管理着所有 Subject, 且負責進行認證和授權, 及會話, 緩存的管理;
  • Authenticator (org.apache.shiro.authc.Authenticator): 認證器, 負責執行和響應使用者的認證請求: 當一個使用者嘗試登陸, 這個邏輯就是

    Authenticator

    執行,

    Authenticator

    知道如何協調一個或者多個與使用者/賬戶資訊相關的

    Realm

    , 從這些

    Realm

    中擷取的資料被用于驗證使用者的身份.
    • Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy) 如果多個

      Realm

      被配置,

      AuthenticationStrategy

      就會協調 Realms 并決定目前認證是否成功: 例如一個 Realm 成功了, 其他的失敗了, 這種情況下一次嘗試是否成功? 是否必須所有 Realms 成功還是僅僅是第一個?
  • Authorizer (org.apache.shiro.authz.Authorizer): 授權器, 或者通路控制器, 用來決定使用者是否有權限進行相應的操作; 即控制着使用者能通路應用中的哪些功能; 和

    Authenticator

    一樣,

    Authorizer

    同樣知道如何協調多種後端資料源用于決定目前使用者是否被允許執行目标操作.
  • SessionManager (org.apache.shiro.session.mgt.SessionManager):

    SessionManager

    知道如何建立和管理使用者

    Session

    , Shiro 原生就能在所有環境下管理使用者會話 (甚至目前沒有可用的 Servlet 或是 EJB 容器). 預設情況下, Shiro 會使用已存在的會話管理機制 (如 Servlet 容器), 但是如果目前上下文不存在這樣的容器, 如獨立應用或是非網絡應用場景, Shiro 會使用内置的企業級會話管理機制以提供統一的程式設計體驗.

    如果寫過 Servlet 就應該知道 Session 的概念, Session 呢需要有人去管理它的生命周期, 這個元件就是 SessionManager; 而 Shiro 并不僅僅可以用在 Web 環境, 也可以用在如普通的 JavaSE 環境, EJB 等環境; Shiro 就抽象了一個自己的 Session 來管理主體與應用之間互動的資料; 這樣的話, 比如我們在 Web 環境用, 剛開始是一台 Web 伺服器; 接着又上了台 EJB 伺服器; 這時想把兩台伺服器的會話資料放到一個地方, 這個時候就可以實作自己的分布式會話 (如把資料放到 Memcached 伺服器)

    • SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO) 它的存在允許使用任意資料源來持久化會話, 依托

      SessionManager

      以 CRUD 的形式執行緩存的持久化操作.

      DAO 大家都用過, 資料通路對象, 用于會話的 CRUD, 比如我們想把 Session 儲存到資料庫, 那麼可以實作自己的 SessionDAO, 通過如 JDBC 寫到資料庫; 比如想把 Session 放到 Memcached 中, 可以實作自己的 Memcached SessionDAO; 另外 SessionDAO 中可以使用 Cache 進行緩存, 以提高性能

  • CacheManager (org.apache.shiro.cache.CacheManager) 用于建立和管理

    Cache

    執行個體. 正因為 Shiro 能夠通路許多用于認證, 授權, 以及會話管理的後端資料源, 能夠提升通路性能和效率的緩存通常是首要需要考慮的.
  • Cryptography (org.apache.shiro.crypto.*) Shiro 的加密包在原有 Java 提供的加密機制上再次封裝, 提供了更加易用和易于了解的 API,
  • Realms (org.apache.shiro.realm.Realm) 正如之前提到的, Realms 是 Shiro 和應用程式的安全資料之間的橋梁. 當需要和安全相關的資料 (如使用者賬戶) 互動來進行 (登入) 認證和 (通路) 授權的時候, Shiro 會從配置的一個或者多個

    Realm

    中擷取資訊.

    可以有 1 個或多個 Realm, 可以認為是安全實體資料源, 即用于擷取安全實體的; 可以是 JDBC 實作, 也可以是 LDAP 實作, 或者記憶體實作等等; 由使用者提供; 注意: Shiro 不知道你的使用者 / 權限存儲在哪及以何種格式存儲;是以我們一般在應用中都需要實作自己的 Realm;

TBC…

繼續閱讀