三個核心組件:Subject, SecurityManager 和 Realms.
Subject:即“當(dāng)前操作用戶”。但是,在Shiro中,Subject這一概念并不僅僅指人,也可以是第三方進(jìn)程、后臺帳戶(Daemon Account)或其他類似事物。它僅僅意味著“當(dāng)前跟軟件交互的東西”。但考慮到大多數(shù)目的和用途,你可以把它認(rèn)為是Shiro的“用戶”概念。
Subject代表了當(dāng)前用戶的安全操作,SecurityManager則管理所有用戶的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內(nèi)部組件實例,并通過它來提供安全管理的各種服務(wù)。
Realm: Realm充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說,當(dāng)對用戶執(zhí)行認(rèn)證(登錄)和授權(quán)(訪問控制)驗證時,Shiro會從應(yīng)用配置的Realm中查找用戶及其權(quán)限信息。
從這個意義上講,Realm實質(zhì)上是一個安全相關(guān)的DAO:它封裝了數(shù)據(jù)源的連接細(xì)節(jié),并在需要時將相關(guān)數(shù)據(jù)提供給Shiro。當(dāng)配置Shiro時,你必須至少指定一個Realm,用于認(rèn)證和(或)授權(quán)。配置多個Realm是可以的,但是至少需要一個。
Shiro內(nèi)置了可以連接大量安全數(shù)據(jù)源(又名目錄)的Realm,如LDAP、關(guān)系數(shù)據(jù)庫(JDBC)、類似INI的文本配置資源以及屬性文件等。如果缺省的Realm不能滿足需求,你還可以插入代表自定義數(shù)據(jù)源的自己的Realm實現(xiàn)。
摘自百度百科
如果想系統(tǒng)學(xué)習(xí)推薦張開濤的《跟我學(xué)Shiro》原文地址:http://jinnianshilongnian.iteye.com/blog/2018936
(1)使用用戶的登錄信息創(chuàng)建令牌
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token可以理解為用戶令牌,登錄的過程被抽象為Shiro驗證令牌是否具有合法身份以及相關(guān)權(quán)限。
(2)執(zhí)行登陸動作
SecurityUtils.setSecurityManager(securityManager); // 注入SecurityManager
Subject subject = SecurityUtils.getSubject(); // 獲取Subject單例對象
subject.login(token); // 登陸
(3)判斷用戶
Shiro本身無法知道所持有令牌的用戶是否合法,因為除了項目的設(shè)計人員恐怕誰都無法得知。因此Realm是整個框架中為數(shù)不多的必須由設(shè)計者自行實現(xiàn)的模塊,當(dāng)然Shiro提供了多種實現(xiàn)的途徑,本文只介紹最常見也最重要的一種實現(xiàn)方式——數(shù)據(jù)庫查詢。
(4)兩條重要的英文
我在學(xué)習(xí)Shiro的過程中遇到的第一個障礙就是這兩個對象的英文名稱:AuthorizationInfo,AuthenticationInfo。不用懷疑自己的眼睛,它們確實長的很像,不但長的像,就連意思都十分近似。
在解釋它們前首先必須要描述一下Shiro對于安全用戶的界定:和大多數(shù)操作系統(tǒng)一樣。用戶具有角色和權(quán)限兩種最基本的屬性。例如,我的Windows登陸名稱是learnhow,它的角色是administrator,而administrator具有所有系統(tǒng)權(quán)限。這樣learnhow自然就擁有了所有系統(tǒng)權(quán)限。那么其他人需要登錄我的電腦怎么辦,我可以開放一個guest角色,任何無法提供正確用戶名與密碼的未知用戶都可以通過guest來登錄,而系統(tǒng)對于guest角色開放的權(quán)限極其有限。
同理,Shiro對用戶的約束也采用了這樣的方式。AuthenticationInfo代表了用戶的角色信息集合,AuthorizationInfo代表了角色的權(quán)限信息集合。如此一來,當(dāng)設(shè)計人員對項目中的某一個url路徑設(shè)置了只允許某個角色或具有某種權(quán)限才可以訪問的控制約束的時候,Shiro就可以通過以上兩個對象來判斷。說到這里,大家可能還比較困惑。先不要著急,繼續(xù)往后看就自然會明白了。
二、實現(xiàn)Realm
如何實現(xiàn)Realm是本文的重頭戲,也是比較費(fèi)事的部分。這里大家會接觸到幾個新鮮的概念:緩存機(jī)制、散列算法、加密算法。由于本文不會專門介紹這些概念,所以這里僅僅拋磚引玉的談幾點,能幫助大家更好的理解Shiro即可。