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

譯者:劉曉日 html

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

軟件設計一般是基於用戶故事來實現的,也就是會根據用戶如何與系統交互來設計用戶接口或者服務API。好比這樣一個用戶故事,用戶登陸後會顯示一個查看我的帳戶信息的按鈕,若是用戶未註冊,則顯示一個註冊按鈕。 算法

這個用戶故事暗含了應用主要應完成的用戶需求。即便這裏的用戶不是人而是第三方系統,在編碼時也一樣當作與系統交互的「用戶」來處理。 數據庫

Apache Shiro的這種理念反應在本身的設計中,經過將直觀的概念暴露給開發人員,使得Apache Shiro在幾乎全部的應用中都易於使用。 apache

概述

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怎麼執行安全操做了。 session

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

相關文章
相關標籤/搜索