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