天天看點

Apache Shiro (一)- 概念篇

1、Shiro 是什麼?

ApacheShiro 是一個功能強大且易于使用的 Java 安全架構,它執行身份驗證、授權、加密和會話管理,并可用于保護任何應用程式-從指令行應用程式、移動應用程式到最大 Web 和企業應用程式

2、背景

對于一個架構來說,要真正為它應該滿足其他替代方案無法滿足的需求。要了解這一點,就需要看看 Shiro 的曆史和它建立時的替代方案,下面我們談談 Shiro 的曆史背景:

(1)、在 2008 年加入 AcpacheSoftwareFoundation 之前, Shiro 已經5歲了,以前被稱為 JSecurity 項目,該項目始于 2003 年初。在 2003 年,對于 Java 應用程式開發人員來說,并沒有很多通用的安全選擇,幾乎隻能使用 Java 身份驗證和授權服務(也稱為 JAAS)。 JAAS有很多缺點:盡管它的身份驗證功能是可以容忍的,但授權方面卻很乏味,而且使用起來令人沮喪。另外,JAAS與虛拟機級的安全問題密切相關,例如:确定是否允許在 JVM 中加載類。作為一個應用程式開發人員,我更關心的是應用程式最終關心使用者做什麼,而不是我的代碼在 JVM 中可以做什麼。

(2)、 還有 密碼學問題。有時,我們都需要確定資料安全,但除非你是密碼專家,否則 Java 密碼體系結構很難了解。 API 中充滿了檢查過的異常,使用起來很麻煩。是以,我們希望有一個更幹淨的解決方案,以便在必要時友善地加密和解密資料。

(3)、是以,從 2003 年初的安全前景來看,您可以很快意識到,在一個單一的、具有凝聚力的架構中,沒有任何東西能夠滿足所有這些需求。正因為如此,JSecurity ,以及後來的 ApacheShiro 誕生了。

3、三大核心概念

Subject, SecurityManager 和 Realm

  • Subject:即“目前操作使用者”。但是,在 Shiro 中,Subject 這一概念并不僅僅指人,也可以是第三方程序、背景帳戶(Daemon Account)或其他類似事物。它僅僅意味着“目前跟軟體互動的東西”。但考慮到大多數目的和用途,你可以把它認為是 Shiro 的“使用者”概念。Subject 代表了目前使用者的安全操作,SecurityManager 則管理所有使用者的安全操作。
  • SecurityManager:它是 Shiro 架構的核心,典型的 Facade 模式,Shiro 通過 SecurityManager 來管理内部元件執行個體,并通過它來提供安全管理的各種服務。當 Shiro 與一個 Subject 進行互動時,實質上是幕後的 SecurityManager 處理所有繁重的 Subject 安全操作。
  • Realm:Realm 充當了 Shiro 與應用安全資料間的“橋梁”或者“連接配接器”。也就是說,當對使用者執行認證(登入)和授權(通路控制)驗證時,Shiro 會從應用配置的Realm中查找使用者及其權限資訊。從這個意義上講,Realm 實質上是一個安全相關的 DAO:它封裝了資料源的連接配接細節,并在需要時将相關資料提供給 Shiro。當配置 Shiro 時,你必須至少指定一個 Realm,用于認證和(或)授權。配置多個Realm是可以的,但是至少需要一個。Shiro 内置了可以連接配接大量安全資料源(又名目錄)的 Realm,如 LDAP、關系資料庫(JDBC)、類似 INI 的文本配置資源以及屬性檔案等。如果預設的 Realm 不能滿足需求,你還可以插入代表自定義資料源的自己的 Realm 實作。

4、Shiro 有什麼用?

Shiro 的架構如下:

Apache Shiro (一)- 概念篇

SecurityManager: 它管理着所有 Subject、且負責進行認證和授權、及會話、緩存的管理

Realm: 它是資料通路的接口,用來擷取鑒權、授權相關的資料(帳号、密碼、權限、角色等)

Authenticator: 認證器,負責 Subject 認證的,即确定使用者是否登入成功

Authorizer: 授權器,即權限授權,給 Subject 配置設定權限,以此控制可通路的資源

SessionManager: 它可以幫助在不同的環境下使用 session 功能,比如非 web 環境下和分布式環境下等

SessionDAO: 對 session 的 CURD 操作

CacheManager: 緩存控制器,來管理如使用者、角色、權限等的緩存的

Cryptography: 密碼子產品,用于加密解密

Permission/Role: 權限是描述功能的一種聲明;角色代表權限的集合

AuthenticationToken/AuthenticationInfo/AuthorizationInfo/SecurityUtils: Others.

5、為什麼要使用 Shiro ?

  1. 易用性(Easy To Use):易用性是項目的最終目标。應用程式安全性可能非常混亂和令人沮喪,并被認為是“必要之惡”。如果我們使它易于使用,以至于新手程式員可以開始使用它,那麼它就不必再痛苦了。
  2. 全面性(Comprehensive):Apache Shiro 聲稱沒有其他具有如此廣泛範圍的安全架構,它是”一站式服務“是以它有可能滿足的您的各種各樣需要。
  3. 靈活(Flexble):ApacheShiro 可以在任何應用程式環境中工作。雖然它在 Web 、EJB 和 IOC 環境中 工作,但也不依賴它們。Shiro 也不要求任何規範,甚至沒有許多依賴項。
  4. Web 能力(Web Capable):ApacheShiro 提供了極好的 Web 應用程式支援,允許您基于應用程式 URL 和 Web 協定(例如 REST)建立靈活的安全政策,同時還提供了一組 JSP 庫來控制頁面輸出。
  5. 可插入(Pluggable):Shiro 的幹淨 API 和設計模式使它易于與許多其他架構和應用程式內建。我們看到 Shiro 與 Spring、Grails、Wicket、Tapestry、Mule、ApacheCamel、Vaadin 等架構無縫內建。

繼續閱讀