譯者:劉曉日 html
Apache Shiro設計理念是用直觀、簡單的方式來保證應用的安全。 web
軟件設計一般是基於用戶故事來實現的,也就是會根據用戶如何與系統交互來設計用戶接口或者服務API。好比這樣一個用戶故事,用戶登陸後會顯示一個查看我的帳戶信息的按鈕,若是用戶未註冊,則顯示一個註冊按鈕。 算法
這個用戶故事暗含了應用主要應完成的用戶需求。即便這裏的用戶不是人而是第三方系統,在編碼時也一樣當作與系統交互的「用戶」來處理。 數據庫
Apache Shiro的這種理念反應在本身的設計中,經過將直觀的概念暴露給開發人員,使得Apache Shiro在幾乎全部的應用中都易於使用。 apache
Shiro有三個主要的頂級概念:Subject、SecurityManager、Realms。下圖描述了這幾個概念之間的交互,下面也將一一作介紹。 編程
下圖展示了Shiro框架的核心概念,隨後會一一對其做出簡短說明: 緩存
安全領域中用戶的縮影,能夠是人,第三方服務,corn做業等,負責與系統交互。 安全
就像上文提到的,SecurityManager是Shiro框架的核心。它充當「保護傘」對象的做用,內部協調各個組件,以確保它們順利開展工做,並且還負責管理Subject,這樣它也就獲悉了每一個Subject怎麼執行安全操做了。 session
Authenticator負責發出和處理用戶的認證請求。當用戶登陸時,Authenticator負責處理登陸邏輯。Authenticator可經過一個或多個Realm獲取用戶信息,這些信息用來驗證當前用戶身份。 框架
若是配置了多個Realm,就須要AuthenticationStrategy協調Realms來決定在什麼樣的狀況下一個認證的是成功的或失敗的。(好比,一個realm認證成功,其餘失敗,那認證是否經過呢?)
Authorizer負責應用中用戶的訪問控制。它是決定用戶是否能夠在應用中進行某件事的機制。和Authenticator同樣,Authorizer能夠經過Realm獲取角色和權限信息,這樣Authorizer就能夠確切的知道是否容許用戶完成其預期的操做。
SessionManager用來建立和管理用戶Session的生命週期,在任何應用環境下,均可覺得用戶提供穩定的Session。Shiro能夠在任何應用環境下管理用戶Session,不須要依附於WEB/Servlet或者EJB容器,這個特性在安全框架領域是惟一的。好比在Servlet容器環境下,默認使用容器自帶的Session,若是像在獨立應用或非web容器環境下,根本就沒有session的存在,那麼Shiro使用其內置的企業會話管理器提供一樣的編程體驗。SessionDao的存在使得任何數據源均可以用來持久session。
SessionDao爲SecurityManager提供會話持久(CRUD)功能,這樣就可以讓任何數據源參與到會話管理基礎設施中來。
CacheManager爲Shiro的其餘組件提供建立緩存實例和管理緩存生命週期的功能。由於Shiro的認證、受權、會話管理支持多種數據源,因此訪問數據源時,使用緩存來提升訪問效率是上乘的選擇。當下主流開源或企業級緩存框架均可以繼承到Shiro中,來獲取更快更高效的用戶體驗。
Cryptography是企業級安全框架基本特徵。Shiro的加密包中,包含了易於使用和理解的密碼加密,哈希和其餘不一樣加密算法的實現。加密包下面的全部類都是通過精心設計的,來達到易於使用和理解的目的,以前使用過Java自帶的加密API的會了解到,它是很難使用的。Shiro的加密API簡化了Java複雜的加密機制,並且很容易使用。
上文中也提到過,Realms做爲Shiro和應用中安全數據源之間的橋樑或者鏈接器。當須要獲取用戶帳戶進行認證(登錄)或受權(訪問控制)時,Shiro就會在應用的配置中查找負責這項工做的Realm(一個或多個)來完成獲取安全數據。能夠配置多個Realm,大多狀況是一個數據源一個Realm,Shiro會負責爲認證和受權協調多個Realm一同工做。
因爲Shiro採用以Subject爲中心的編程方式,因此幾乎不多有機會直接與SecurityManager打交道(但與SecurityManager打交道對框架開發人員很重要),儘管如此,瞭解SecurityManager的做用也仍是很重要的,爲應用配置SecurityManager的時候尤其重要。
如上文所述,SecurityManager負責處理應用中的安全操做,管理全部應用用戶的狀態。Shiro中SecurityManager的默認實現包括以下:
等等。
可是讓一個組件完成這麼多功能,並且作到靈活可定製是很是困難的。爲了簡化配置和使配置更靈活,Shiro的各類實現採用了高度的模塊化。模塊化以後,SecurityManager實際上就做爲一個輕量級「容器」,幾乎全部的功能都委託給內部或包裝組件實現。這種包裝的設計方法在詳細的框架圖中也有所體現。
這些組件纔是真正的功能實現者,SecurityManager知道如何以及什麼時候協調這些組件作正確的事情便可。