Apache Shiro系列教程之三:Shiro的結(jié)構(gòu)
Shiro的設(shè)計目標是簡化應用的安全管理工作。軟件通常是以用戶為基礎(chǔ)設(shè)計的。也就是說,我們經(jīng)常是根據(jù)用戶是怎樣和我們的軟件交互的來設(shè)計相關(guān)的用戶接口。比如,你可能會說“如果是已經(jīng)登錄的用戶與我的軟件交互,那么我給他就顯示一個按鈕,讓他點擊后可以查看自己的賬戶信息。如果用戶沒有登錄,那么我就顯示一個注冊按鈕”。
這個例子說明了我們軟件中很多代碼都是為了滿足用戶需求而寫。即使“用戶”有時候壓根就不是一個人(比如說另一個軟件系統(tǒng))。
Shiro的設(shè)計反映了這些思想,這樣使得開發(fā)者更加容易理解Shiro中的一些概念,也使得Shiro更加易用。
一、概覽Shiro結(jié)構(gòu)
從高層次來看,Shiro的結(jié)構(gòu)中有三個主要的概念:Subject、SecurityManager和Realms。下圖展示了這些組件是如何交互的:
-
Subject:指當前正在執(zhí)行程序的“用戶”。Subject含義更廣,因為用戶通常是指人,而Subject可以指人、進程、計劃任務(wù)、守護進程等。準確的說,Subject指的是“當前和軟件交互的事物”。在多數(shù)場景中,你可以將Subject粗暴地認為是用戶。
Subject對象都會和一個SecurityManager對象綁定。當你和一個Subject交互時,這些交互行為會被相應的SecurityManager翻譯為subject-specific的行為。 -
SecurityManager:SecurityManager是Shiro結(jié)構(gòu)中的核心。它用來協(xié)調(diào)其內(nèi)部的各種安全組件。然而,一旦SecurityManager和其內(nèi)部的安全組件配置完成后,程序員就不再會用到它了,這時候程序員通常是與Subject的API打交道。
我們將在后序教程中詳細介紹SecurityManager。但是在此之前,要知道當我們與Subject交互時,實際上是SecurityManager在幕后幫我們完成了那些操作,從上面的圖中也可以看出這一點。 -
Realms:Realms就像一個橋或連接器,將Shiro和你的應用安全數(shù)據(jù)連接起來。當我們用安全相關(guān)的數(shù)據(jù)交互時,比如用戶賬戶的身份驗證(登錄)和授權(quán)管理,Shiro會從一個或多個配置好的Realms中尋找相關(guān)數(shù)據(jù)。
從這個角度來說,Realms實際上是一個DAO:將連接到數(shù)據(jù)源的細節(jié)封裝到內(nèi)部,并且使Shiro可以輕易地讀取相關(guān)的數(shù)據(jù)。當我們配置Shiro時,必須至少有一個Realms。SecurityManager可以由多個Realms配置,但至少有一個Realms配置。
Shiro提供了多種Realms去連接數(shù)據(jù)源,如LDAP,數(shù)據(jù)庫(JDBC),文本配置文件(如INI)。
和其他內(nèi)部組件一樣,SecurityManager管理Realms如何獲取安全數(shù)據(jù)和認證數(shù)據(jù)去配置Subject。
二、詳細結(jié)構(gòu)
下圖展示了Shiro的詳細結(jié)構(gòu):