Shiro 安全框架1—簡介、核心組件與架構

Shiro 安全框架1—簡介、核心組件與架構

一、簡介

1.1 概述

Apache Shiro(發音爲“shee-roh”,日語“堡壘(Castle)”的意思)是一個強大易用的 Java 安全框架,可以乾淨地處理身份驗證,授權,企業會話管理,單點登錄和加密服務,可爲任何應用提供安全保障 - 從命令行應用、移動應用到大型網絡及企業應用。

1.2 特點

Apache Shiro的首要目標是易於使用和理解。安全有時可能非常複雜,甚至會很痛苦,但這不是必須的。框架應儘可能掩蓋複雜性,並公開乾淨直觀的API,以簡化開發人員確保其應用程序安全的工作。

  • 易於使用 - 易用性是這個項目的最終目標。應用安全有可能會非常讓人糊塗,令人沮喪,並被認爲是“必要之惡”【譯註:比喻應用安全方面的編程。】。若是能讓它簡化到新手都能很快上手,那它將不再是一種痛苦了。
  • 廣泛性 - 沒有其他安全框架可以達到 Apache Shiro 宣稱的廣度,它可以爲你的安全需求提供“一站式”服務。
  • 靈活性 - Apache Shiro 可以工作在任何應用環境中。雖然它工作在 Web、EJB 和 IoC 環境中,但它並不依賴這些環境。Shiro 既不強加任何規範,也無需過多依賴。
  • Web 能力 - Apache Shiro 對 Web 應用的支持很神奇,允許你基於應用 URL 和 Web 協議(如 REST)創建靈活的安全策略,同時還提供了一套控制頁面輸出的 JSP 標籤庫。
  • 可插拔 - Shiro 乾淨的 API 和設計模式使它可以方便地與許多的其他框架和應用進行集成。你將看到 Shiro 可以與諸如 Spring、Grails、Wicket、Tapestry、Mule、Apache Camel、Vaadin 這類第三方框架無縫集成。
  • 支持 - Apache Shiro 是 Apache 軟件基金會成員,這是一個公認爲了社區利益最大化而行動的組織。項目開發和用戶組都有隨時願意提供幫助的友善成員。像 Katasoft 這類商業公司,還可以給你提供需要的專業支持和服務。

1.3 主要功能

  • 驗證用戶身份以驗證其身份
  • 對用戶執行訪問控制,例如:
    • 確定是否爲用戶分配了特定的安全角色確定是否允許用戶執行某項操作
    • 即使在沒有Web或EJB容器的情況下,也可以在任何環境中使用Session API。
  • 在身份驗證,訪問控制或會話的生存期內對事件做出反應。
  • 彙總1個或更多用戶安全數據的數據源,並將其全部顯示爲單個複合用戶“視圖”。
  • 啓用單點登錄(SSO)功能
  • 啓用“記住我”服務以進行用戶關聯,而無需登錄
  • 以及更多-所有功能都集成到了易於使用的內聚性API中。

二、Shiro核心組件

shiro 組件
Shiro以Shiro開發團隊所謂的“應用程序安全性的四個基石”爲目標-身份驗證,授權,會話管理和密碼術:

  • Authentication,身份驗證:有時稱爲“登錄”,這是證明用戶就是他們所說的身份的行爲。
  • Authorization,授權:訪問控制的過程,即確定“誰”有權訪問“什麼”。
  • Session Management,會話管理:即使在非Web或EJB應用程序中,也可以管理用戶特定的會話。
  • Cryptography密碼術:使用密碼算法保持數據安全,同時仍然易於使用。

在不同的應用程序環境中,還具有其他功能來支持和加強這些問題,尤其是:

  • Web 支持:Shiro的網絡支持API可幫助輕鬆保護網絡應用程序。
  • Caching,緩存:緩存是Apache Shiro API的一線公民,可確保安全操作保持快速有效。
  • Concurrency,併發性:Apache Shiro的併發功能支持多線程應用程序。
  • Testing,測試:測試支持可幫助您編寫單元測試和集成測試,並確保您的代碼將按預期進行保護。
  • “Run As,運行方式”:一種功能,允許用戶採用其他用戶的身份(如果允許),有時在管理方案中很有用。
  • “Remember Me記住我”:記住用戶在各個會話中的身份,因此他們只需要在必要時登錄即可。

注意:shiro不會維護用戶與權限,需要程序員自己維護並通過相應的接口注入給shiro。

三、Shiro架構

shiro架構圖
在最高概念級別上,Shiro的體系結構具有3個主要概念:Subject(主題),SecurityManager(安全管理器)和Realms(領域)。

  • **Subject **: **Subject **本質上是當前執行用戶的特定於安全性的“視圖”。 “用戶”一詞通常表示一個人,而 **Subject **可以是一個人,但它也可以表示第三方服務,守護程序帳戶,cron作業或任何類似的東西-基本上是當前與該軟件交互的任何東西。 **Subject **實例都綁定到(並需要)SecurityManager。 與 **Subject **進行交互時,這些交互會轉換爲與SecurityManager特定的 **Subject **交互。

  • SecurityManagerSecurityManager是Shiro體系結構的核心,並充當一種“傘”對象,該對象協調其內部安全組件,這些安全組件共同構成一個對象圖。 但是,一旦爲應用程序配置了SecurityManager及其內部對象圖,通常就不理會它,並且應用程序開發人員幾乎將所有時間都花在**Subject **的API上。

    重要的是要認識到,當您與Subject進行交互時,實際上是在幕後的SecurityManager會對任何 Subject安全操作進行所有繁重的工作。

  • RealmsRealms充當Shiro與應用程序的安全數據之間的“橋樑”或“連接器”。 當真正需要與安全性相關的數據(如用戶帳戶)進行交互以執行身份驗證authentication (登錄)和授權authorization (訪問控制)時,Shiro會從爲應用程序配置的一個或多個Realms中查找許多此類內容。

    從這個意義上說,領域本質上是特定於安全性的DAO:它封裝了數據源的連接詳細信息,並根據需要使關聯數據可供Shiro使用。 在配置Shiro時,您必須至少指定一個領域用於身份驗證和/或授權。 SecurityManager可以配置有多個領域,但至少需要一個。

    Shiro提供了開箱即用的領域,可以連接到許多安全數據源,例如LDAP,關係數據庫(JDBC),文本配置源(例如INI和屬性文件)等。 如果默認的Realms不能滿足您的需求,那麼您可以插入自己的Realm實現以表示自定義數據源。

    像其他內部組件一樣,Shiro SecurityManager管理領域如何用於獲取要表示爲Subject實例的安全性和身份數據。

四、詳細架構

詳細架構圖

  • Subject (org.apache.shiro.subject.Subject)
    當前與軟件進行交互的實體(用戶,第三方服務,計劃任務等)的特定於安全性的“視圖”。
  • SecurityManager (org.apache.shiro.mgt.SecurityManager)
    SecurityManager是Shiro架構的核心。 它主要是一個“傘”對象,用於協調其託管組件以確保它們能夠順利協作。 它還管理Shiro對每個應用程序用戶的視圖,因此它知道如何對每個用戶執行安全操作。
  • Authenticator (org.apache.shiro.authc.Authenticator)
    Authenticator是負責執行用戶的身份驗證(登錄)並對其作出反應的組件。 當用戶嘗試登錄時,該邏輯由身份驗證器執行。 身份驗證器知道如何與存儲相關用戶/帳戶信息的一個或多個領域協調。 從這些領域獲得的數據用於驗證用戶的身份,以確保用戶確實是他們所說的真實身份。
    • Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy)
      如果配置了多個Realm ,則AuthenticationStrategy會協調Realm 以確定身份驗證嘗試成功或失敗的條件(例如,如果一個Realm 成功而其他Realm 失敗,則嘗試成功嗎?必須所有Realm 都成功嗎? 第一?)。
  • Authorizer (org.apache.shiro.authz.Authorizer)
    Authorizer 授權者是負責確定應用程序中用戶訪問控制的組件。 它是最終表明是否允許用戶做某事的機制。 與身份驗證器一樣,授權者也知道如何與多個後端數據源進行協調以訪問角色和權限信息。 授權者使用此信息來確定是否允許用戶執行給定的操作。
  • SessionManager (org.apache.shiro.session.mgt.SessionManager)
    SessionManager知道如何創建和管理用戶會話生命週期,以便爲所有環境中的用戶提供可靠的會話體驗。 這是安全框架領域中的一項獨特功能-Shiro能夠在任何環境中本地管理用戶會話,即使沒有Web / Servlet或EJB容器也可以。 默認情況下,Shiro將使用現有的會話機制(例如Servlet容器)(如果可用),但是如果沒有這種機制(例如在獨立應用程序或非Web環境中),它將使用其內置的企業會話管理來 提供相同的編程經驗。 SessionDAO的存在是爲了允許使用任何數據源來保留會話。
  • CacheManager (org.apache.shiro.cache.CacheManager)
    CacheManager創建和管理其他Shiro組件使用的Cache實例生命週期。 因爲Shiro可以訪問許多後端數據源以進行身份驗證,授權和會話管理,所以緩存一直是框架中的一流架構功能,可以在使用這些數據源時提高性能。 可以將任何現代的開源和/或企業緩存產品插入Shiro,以提供快速有效的用戶體驗。
  • Cryptography (org.apache.shiro.crypto.*)
    密碼術是企業安全框架的自然補充。 Shiro的加密軟件包包含易於使用和理解的加密密碼,哈希(又名摘要)和不同編解碼器實現的表示形式。 該軟件包中的所有類都經過精心設計,以使其易於使用和理解。 使用Java的本機加密技術支持的任何人都知道,馴服它可能是具有挑戰性的動物。 Shiro的加密API簡化了複雜的Java機制,並使加密技術易於爲普通凡人使用。
  • Realms (org.apache.shiro.realm.Realm)
    領域充當Shiro與應用程序的安全數據之間的“橋樑”或“連接器”。 當真正需要與安全性相關的數據(如用戶帳戶)進行交互以執行身份驗證(登錄)和授權(訪問控制)時,Shiro會從爲應用程序配置的一個或多個Realms中查找許多此類內容。 您可以根據需要配置任意多個領域(通常每個數據源一個),並且Shiro將根據需要與它們進行協調,以進行身份驗證和授權。

五、參考

https://shiro.apache.org

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