Apache Shiro的設計目標是經過直觀且易於使用來簡化應用程序安全性。Shiro的核心設計模擬了大多數人如何在與某人(或某物)進行交互的狀況下如何考慮應用程序安全性。html
軟件應用程序一般是根據用戶案例設計的。也就是說,您一般會根據用戶與軟件的交互方式來設計用戶界面或服務API。例如,您可能會說:「若是與個人應用程序交互的用戶已登陸,我將向他們顯示一個按鈕,使他們能夠單擊以查看其賬戶信息。若是他們沒有登陸,我將顯示一個註冊按鈕。」spring
該示例語句代表,編寫應用程序主要是爲了知足用戶需求。即便「用戶」是另外一個軟件系統而不是人類,您仍然能夠編寫代碼以根據當前正在與您的軟件進行交互的人員(或內容)來反映行爲。數據庫
Shiro在本身的設計中反映了這些概念。經過匹配軟件開發人員已經很直觀的內容,Apache Shiro仍然保持直觀且易於在幾乎任何應用程序中使用。apache
在最高概念層次,四郎的建築有3個主要的概念:Subject
,SecurityManager
和Realms
。下圖是這些組件如何交互的高級概述,咱們將在下面介紹每一個概念:編程
Subject
本質上是當前正在執行的用戶的安全特定「視圖」。「用戶」一詞一般表示一我的,一我的Subject
能夠是一我的,但它也能夠表示第三方服務,守護程序賬戶,cron做業或相似的東西-基本上是當前與該軟件交互的任何東西。Subject
實例都綁定到(並要求)SecurityManager
。當您與互動時Subject
,這些互動會轉化爲與主題相關的互動SecurityManager
。後端
SecurityManager
是Shiro體系結構的核心,並充當一種「傘」對象,該對象協調其內部安全組件,這些安全組件一塊兒造成對象圖。可是,一旦爲應用程序配置了SecurityManager及其內部對象圖,一般就不理會它,而且應用程序開發人員幾乎全部時間都花在Subject
API上。稍後咱們將SecurityManager
詳細討論,可是重要的是要認識到,當您與進行交互時Subject
,SecurityManager
對於任何Subject
安全操做而言,確實是幕後工做。這反映在上面的基本流程圖中。api
從這個意義上說,領域本質上是特定於安全性的DAO:它封裝了數據源的鏈接詳細信息,並根據須要使關聯數據可用於Shiro。在配置Shiro時,您必須至少指定一個領域用於身份驗證和/或受權。所述SecurityManager
可與多個境界被配置,但至少有一個是必需的。緩存
Shiro提供了開箱即用的領域,能夠鏈接到許多安全數據源(又名目錄),例如LDAP,關係數據庫(JDBC),文本配置源(例如INI和屬性文件)等。若是默認的Realms不能知足您的需求,那麼您能夠插入本身的Realm實現以表示自定義數據源。安全
像其餘內部組件同樣,ShiroSecurityManager
管理着如何使用領域來獲取要表示爲Subject
實例的安全性和身份數據。session
下圖顯示了Shiro的核心架構概念,並簡要概述了每一個架構:
org.apache.shiro.subject.Subject
) SecurityManager
是Shiro體系結構的核心。它主要是一個「傘」對象,用於協調其託管組件以確保它們可以順利協同工做。它還管理Shiro對每一個應用程序用戶的視圖,所以它知道如何對每一個用戶執行安全性操做。認證器(org.apache.shiro.authc.Authenticator)
的Authenticator
是,負責執行和用戶反應,以驗證(登陸)的嘗試的組件。當用戶嘗試登陸時,該邏輯由執行Authenticator
。該Authenticator
知道如何與一個或多個協調Realms
該商店相關的用戶/賬戶信息。從這些數據中得到的數據Realms
用於驗證用戶的身份,以確保用戶確實是他們所說的真實身份。
Realm
配置了多個身份驗證策略,則AuthenticationStrategy
它將協調領域以肯定肯定嘗試成功或失敗的條件(例如,一個領域成功但其餘領域失敗) ,嘗試是否成功?全部領域都必須成功嗎?只有第一個?)。Authorizer
是部件負責肯定用戶在該應用程序的訪問控制。它是最終代表是否容許用戶作某事的機制。像同樣Authenticator
,Authorizer
還知道如何與多個後端數據源進行協調以訪問角色和權限信息。在Authorizer
使用該信息來準確肯定是否容許用戶執行特定的操做。SessionManager(org.apache.shiro.session.mgt.SessionManager)
將SessionManager
知道如何建立和管理用戶Session
生命週期,提供在全部環境中的用戶強大的會話體驗。這是安全框架領域中的一項獨特功能-Shiro可以在任何環境中本地管理用戶會話,即便沒有Web / Servlet或EJB容器也能夠。默認狀況下,Shiro將使用現有的會話機制(例如Servlet容器)(若是可用),可是若是沒有這種機制(例如在獨立應用程序或非Web環境中),它將使用其內置的企業會話管理來提供相同的編程經驗。的SessionDAO
存在容許任何數據源被用來堅持的會議。
SessionDAO
執行Session
持久代(CRUD)操做SessionManager
。這容許將任何數據存儲插入會話管理基礎結構。CacheManager
建立和管理Cache
其餘四郎組件使用實例的生命週期。由於Shiro能夠訪問許多後端數據源以進行身份驗證,受權和會話管理,因此緩存一直是框架中的一流架構功能,能夠在使用這些數據源時提升性能。能夠將任何現代的開源和/或企業緩存產品插入Shiro,以提供快速有效的用戶體驗。crypto
軟件包包含易於使用和理解的密碼學密碼,哈希(又名摘要)和不一樣編解碼器實現的表示形式。該軟件包中的全部類都通過精心設計,以使其易於使用和理解。使用Java的本機加密技術支持的任何人都知道,馴服它多是具備挑戰性的動物。Shiro的加密API簡化了複雜的Java機制,並使加密技術易於普通凡人使用。Realms
須要配置任意數量(一般每一個數據源一個),而且Shiro會根據須要進行協調,以進行身份驗證和受權。SecurityManager
由於Shiro的API鼓勵採用以中心爲Subject
中心的編程方法,因此大多數應用程序開發人員不多(若是有的話)SecurityManager
直接與之交互(可是框架開發人員有時可能會以爲有用)。即便這樣,瞭解這些SecurityManager
功能的功能仍然很重要,尤爲是在爲應用程序配置功能時。
如前所述,應用程序SecurityManager
執行安全操做並管理_全部_應用程序用戶的狀態。在Shiro的默認SecurityManager
實現中,這包括:
但這是嘗試在單個組件中進行管理的許多功能。並且,若是將全部內容都納入一個實現類中,那麼使這些事情變得靈活和可定製將很是困難。
爲了簡化配置並實現靈活的配置/可插拔性,Shiro的實如今設計上都是高度模塊化的-其實是模塊化的,所以SecurityManager實現(及其類層次結構)根本不起做用。相反,這些SecurityManager
實現大多充當輕量級的「容器」組件,幾乎將全部行爲委派給嵌套/包裝的組件。這種「包裝」設計反映在上面的詳細架構圖中。
當組件實際執行邏輯時,SecurityManager
實現知道如何以及什麼時候協調組件以實現正確的行爲。
的SecurityManager
實現方式和組件也兼容的JavaBeans,它容許(或配置機構),以方便地定製可插組件經由標準的JavaBeans存取器/ mutator方法(獲取* /組*)。這意味着Shiro的體系結構模塊化能夠轉化爲很是易於配置的自定義行爲。
簡易配置
因爲JavaBeans的兼容性,經過支持JavaBeans風格的配置的任何機制(例如Spring,Guice,JBoss等),使用自定義組件配置SecurityManager都是很是容易的。
接下來咱們將介紹配置。
儘管咱們但願該文檔對您使用Apache Shiro所作的工做有所幫助,但社區一直在不斷改進和擴展文檔。若是您想幫助Shiro項目,請考慮在須要的地方更正,擴展或添加文檔。您提供的每一點幫助都會擴大社區,進而改善Shiro。