Apache Shiro系列教程之三:Shiro的結(jié)構(gòu)

Shiro的設(shè)計(jì)目標(biāo)是簡(jiǎn)化應(yīng)用的安全管理工作。軟件通常是以用戶(hù)為基礎(chǔ)設(shè)計(jì)的。也就是說(shuō),我們經(jīng)常是根據(jù)用戶(hù)是怎樣和我們的軟件交互的來(lái)設(shè)計(jì)相關(guān)的用戶(hù)接口。比如,你可能會(huì)說(shuō)“如果是已經(jīng)登錄的用戶(hù)與我的軟件交互,那么我給他就顯示一個(gè)按鈕,讓他點(diǎn)擊后可以查看自己的賬戶(hù)信息。如果用戶(hù)沒(méi)有登錄,那么我就顯示一個(gè)注冊(cè)按鈕”。

這個(gè)例子說(shuō)明了我們軟件中很多代碼都是為了滿(mǎn)足用戶(hù)需求而寫(xiě)。即使“用戶(hù)”有時(shí)候壓根就不是一個(gè)人(比如說(shuō)另一個(gè)軟件系統(tǒng))。

Shiro的設(shè)計(jì)反映了這些思想,這樣使得開(kāi)發(fā)者更加容易理解Shiro中的一些概念,也使得Shiro更加易用。

一、概覽Shiro結(jié)構(gòu)

從高層次來(lái)看,Shiro的結(jié)構(gòu)中有三個(gè)主要的概念:Subject、SecurityManager和Realms。下圖展示了這些組件是如何交互的:

  • Subject:指當(dāng)前正在執(zhí)行程序的“用戶(hù)”。Subject含義更廣,因?yàn)橛脩?hù)通常是指人,而Subject可以指人、進(jìn)程、計(jì)劃任務(wù)、守護(hù)進(jìn)程等。準(zhǔn)確的說(shuō),Subject指的是“當(dāng)前和軟件交互的事物”。在多數(shù)場(chǎng)景中,你可以將Subject粗暴地認(rèn)為是用戶(hù)。
    Subject對(duì)象都會(huì)和一個(gè)SecurityManager對(duì)象綁定。當(dāng)你和一個(gè)Subject交互時(shí),這些交互行為會(huì)被相應(yīng)的SecurityManager翻譯為subject-specific的行為。
  • SecurityManager:SecurityManager是Shiro結(jié)構(gòu)中的核心。它用來(lái)協(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ù)連接起來(lái)。當(dāng)我們用安全相關(guān)的數(shù)據(jù)交互時(shí),比如用戶(hù)賬戶(hù)的身份驗(yàn)證(登錄)和授權(quán)管理,Shiro會(huì)從一個(gè)或多個(gè)配置好的Realms中尋找相關(guān)數(shù)據(jù)。
    從這個(gè)角度來(lái)說(shuō),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ù)庫(kù)(JDBC),文本配置文件(如INI)。
    和其他內(nèi)部組件一樣,SecurityManager管理Realms如何獲取安全數(shù)據(jù)和認(rèn)證數(shù)據(jù)去配置Subject。

二、詳細(xì)結(jié)構(gòu)

下圖展示了Shiro的詳細(xì)結(jié)構(gòu):

網(wǎng)友評(píng)論