Realm筆記

Realm

Realm類通過繼承AuthorizingRealm將獲取 Subject 相關(guān)信息分成兩步:獲取身份驗證信息(doGetAuthenticationInfo)及授權(quán)信息(doGetAuthorizationInfo)笔时;
1、doGetAuthenticationInfo 獲取身份驗證相關(guān)信息:首先根據(jù)傳入的用戶名獲取 User 信息;然后如果 user 為空扮饶,那么拋出沒找到帳號異常 UnknownAccountException;如果 user 找到但鎖定了拋出鎖定異常 LockedAccountException墓律;最后生成 AuthenticationInfo 信息拂盯,交給間接父類 AuthenticatingRealm 使用 CredentialsMatcher 進(jìn)行判斷密碼是否匹配,如果不匹配將拋出密碼錯誤異常 IncorrectCredentialsException奥秆;另外如果密碼重試此處太多將拋出超出重試次數(shù)異常 ExcessiveAttemptsException;在組裝 SimpleAuthenticationInfo 信息時咸灿,需要傳入:身份信息(用戶名)构订、憑據(jù)(密文密碼)、鹽(username+salt)避矢,CredentialsMatcher 使用鹽加密傳入的明文密碼和此處的密文密碼進(jìn)行匹配悼瘾。
2、doGetAuthorizationInfo 獲取授權(quán)信息:PrincipalCollection 是一個身份集合审胸,調(diào)用 getPrimaryPrincipal 得到之前傳入的用戶名亥宿;然后根據(jù)用戶名調(diào)用 UserService 接口獲取角色及權(quán)限信息。

1.AuthenticationToken

根據(jù)源碼有:

public class UsernamePasswordToken implements HostAuthenticationToken, RememberMeAuthenticationToken
public interface HostAuthenticationToken extends AuthenticationToken 
public interface RememberMeAuthenticationToken extends AuthenticationToken

所以:


AuthenticationToken用于收集用戶提交的身份(如用戶名)及憑據(jù)(如密碼):

public interface AuthenticationToken extends Serializable {
    Object getPrincipal();
    Object getCredentials();
}

1.直接通過AuthenticationToken獲得用戶信息:

String username = (String)token.getPrincipal();
User user = userService.findByUsername(username);

2.由于繼承關(guān)系砂沛,通過UsernamePasswordToken獲得用戶信息:

UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
String username = upToken.getUsername();
String password = new String( upToken.getPassword());

RememberMeAuthenticationToken:提供了 “boolean isRememberMe()” 現(xiàn)“記住我”的功能烫扼;
HostAuthenticationToken:提供了 “String getHost()” 方法用于獲取用戶 “主機(jī)” 的功能。
UsernamePasswordToken:用于實現(xiàn)用戶名 / 密碼 Token 組碍庵,另外其實現(xiàn)了 RememberMeAuthenticationToken 和 HostAuthenticationToken映企,可以實現(xiàn)記住我及主機(jī)驗證的支持。

2.AuthenticationInfo

AuthenticationInfo 有兩個作用:
1.如果 Realm 是 AuthenticatingRealm 子類静浴,則提供給 AuthenticatingRealm 內(nèi)部使用的 CredentialsMatcher 進(jìn)行憑據(jù)驗證堰氓;(如果沒有繼承它需要在自己的 Realm 中自己實現(xiàn)驗證);

2.提供給 SecurityManager 來創(chuàng)建 Subject(提供身份信息)苹享;

MergableAuthenticationInfo 用于提供在多 Realm 時合并 AuthenticationInfo 的功能双絮,主要合并 Principal、如果是其他的如 credentialsSalt得问,會用后邊的信息覆蓋前邊的囤攀。
比如 HashedCredentialsMatcher,在驗證時會判斷 AuthenticationInfo 是否是 SaltedAuthenticationInfo 子類宫纬,來獲取鹽信息抚岗。

Account 相當(dāng)于我們之前的 User,SimpleAccount 是其一個實現(xiàn)哪怔;在 IniRealm宣蔚、PropertiesRealm 這種靜態(tài)創(chuàng)建帳號信息的場景中使用向抢,這些 Realm 直接繼承了 SimpleAccountRealm,而 SimpleAccountRealm 提供了相關(guān)的 API 來動態(tài)維護(hù) SimpleAccount胚委;即可以通過這些 API 來動態(tài)增刪改查 SimpleAccount挟鸠;動態(tài)增刪改查角色 / 權(quán)限信息。及如果您的帳號不是特別多亩冬,可以使用這種方式艘希,具體請參考 SimpleAccountRealm Javadoc。

其他情況一般返回 SimpleAuthenticationInfo 即可硅急。

3.PrincipalCollection

因為我們可以在 Shiro 中同時配置多個 Realm覆享,所以呢身份信息可能就有多個;因此其提供了 PrincipalCollection 用于聚合這些身份信息营袜。
因為 PrincipalCollection 聚合了多個撒顿,此處最需要注意的是 getPrimaryPrincipal,如果只有一個 Principal 那么直接返回即可荚板,如果有多個 Principal凤壁,則返回第一個(因為內(nèi)部使用 Map 存儲,所以可以認(rèn)為是返回任意一個)跪另;

4.AuthorizationInfo

AuthorizationInfo 用于聚合授權(quán)信息的:

public interface AuthorizationInfo extends Serializable {
    Collection<String> getRoles();
    Collection<String> getStringPermissions();
    Collection<Permission> getObjectPermissions();
}

當(dāng)我們使用 AuthorizingRealm 時拧抖,如果身份驗證成功,在進(jìn)行授權(quán)時就通過 doGetAuthorizationInfo 方法獲取角色 / 權(quán)限信息用于授權(quán)驗證免绿。

Shiro 提供了一個實現(xiàn) SimpleAuthorizationInfo唧席,大多數(shù)時候使用這個即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘲驾,一起剝皮案震驚了整個濱河市淌哟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌距淫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婶希,死亡現(xiàn)場離奇詭異榕暇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喻杈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門彤枢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筒饰,你說我怎么就攤上這事缴啡。” “怎么了瓷们?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵业栅,是天一觀的道長秒咐。 經(jīng)常有香客問我,道長碘裕,這世上最難降的妖魔是什么携取? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮帮孔,結(jié)果婚禮上雷滋,老公的妹妹穿的比我還像新娘。我一直安慰自己文兢,他們只是感情好晤斩,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姆坚,像睡著了一般澳泵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旷偿,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天烹俗,我揣著相機(jī)與錄音,去河邊找鬼萍程。 笑死幢妄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茫负。 我是一名探鬼主播蕉鸳,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忍法!你這毒婦竟也來了潮尝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饿序,失蹤者是張志新(化名)和其女友劉穎勉失,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體原探,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡乱凿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咽弦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徒蟆。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖型型,靈堂內(nèi)的尸體忽然破棺而出段审,到底是詐尸還是另有隱情,我是刑警寧澤闹蒜,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布寺枉,位于F島的核電站抑淫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏型凳。R本人自食惡果不足惜丈冬,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甘畅。 院中可真熱鬧埂蕊,春花似錦、人聲如沸疏唾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槐脏。三九已至喉童,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顿天,已是汗流浹背堂氯。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留牌废,地道東北人咽白。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像鸟缕,于是被迫代替她去往敵國和親晶框。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容