Apache Shiro 架構(gòu)提出了3個核心概念:Subject,SecurityManager,Realms
Subject
特指【當(dāng)前用戶】,這里的【用戶】可以是實體世界的用戶(人),也可以是第三方進程、守護進程或類似概念,代表【當(dāng)前正在與軟件進行交互的任何事物】。可以使用如下代碼獲取 Subject
import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();
一旦獲取 Subject 后便可以執(zhí)行諸如登錄、注銷、訪問會話、執(zhí)行授權(quán)檢查等 Shiro 負(fù)責(zé)的功能。
SecurityManager
Subject 對應(yīng) SecurityManager,Subject 代表當(dāng)前用戶的安全操作,而 SecurityManager 管理所有用戶的安全操作。SecurityManager 是 Shiro 架構(gòu)的核心,引用了許多 Shiro 生成的內(nèi)部嵌套的安全組件,這些組件構(gòu)成了一副對象圖。一旦 SecurityManager 配置完成,應(yīng)用開發(fā)人員只需關(guān)注 Subject API。
如何配置 SecurityManager 取決于開發(fā)應(yīng)用類型和環(huán)境,譬如 Web 應(yīng)用通常在 web.xml 中添加 Shiro Servlet Filter,應(yīng)用啟動會自動生成 SecurityManager 實例。基于 Spring 或 Spring Boot 開發(fā)則更加簡單,只需通過 XML 或 Java Config 注入一個 SecurityManager 實例即可。
通常來說 SecurityManager 是以單例形式存在于應(yīng)用中。
Realms
一個 Realm 充當(dāng) Shiro 與應(yīng)用程序安全數(shù)據(jù)間的【橋接器】。Shiro 會從已配置的一個或多個 Realm 中查找用于執(zhí)行身份驗證與授權(quán)等安全操作需要的安全數(shù)據(jù),如用戶賬戶。
Realm 本質(zhì)上是一種安全相關(guān)的 DAO(Data Access Object)。配置Shiro時,必須至少指定一個 Realm 用于身份驗證和/或授權(quán),當(dāng)然也可以配置多個,但至少需要一個。
Shiro 本身提供了許多開箱即用的 Realms,可以連接到不同的安全數(shù)據(jù)源,如 LDAP、JDBC、INI、PROPERTIES 等。開發(fā)人員可以植入基于特定實現(xiàn)的 Realm 表示自定義數(shù)據(jù)源。