Shiro源碼分析系列:03.用戶認(rèn)證流程

簡(jiǎn)單概念

在上一章節(jié)氮惯,我們探討了Filter的執(zhí)行流程镜遣,接下來(lái)仔細(xì)分析用戶的登陸流程。
先看看shiro官方給出的一張圖:


login from apache shiro.jpg

再看幾個(gè)簡(jiǎn)單概念

  • Subject:主體,代表了當(dāng)前 “用戶”捣郊,這個(gè)用戶不一定是一個(gè)具體的人,與當(dāng)前應(yīng)用交互的任何東西都是 Subject抱慌,如網(wǎng)絡(luò)爬蟲(chóng)霜威,機(jī)器人等;即一個(gè)抽象概念粹舵;所有 Subject 都綁定到 SecurityManager钮孵,與 Subject 的所有交互都會(huì)委托給 SecurityManager;可以把 Subject 認(rèn)為是一個(gè)門面眼滤;SecurityManager 才是實(shí)際的執(zhí)行者巴席;

  • SecurityManager:安全管理器;即所有與安全有關(guān)的操作都會(huì)與 SecurityManager 交互诅需;且它管理著所有 Subject漾唉;可以看出它是 Shiro 的核心,它負(fù)責(zé)與后邊介紹的其他組件進(jìn)行交互诱担,如果學(xué)習(xí)過(guò) SpringMVC毡证,你可以把它看成 DispatcherServlet 前端控制器;

  • Realm:域蔫仙,Shiro 從從 Realm 獲取安全數(shù)據(jù)(如用戶料睛、角色、權(quán)限)摇邦,就是說(shuō) SecurityManager 要驗(yàn)證用戶身份恤煞,那么它需要從 Realm 獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否合法;也需要從 Realm 得到用戶相應(yīng)的角色 / 權(quán)限進(jìn)行驗(yàn)證用戶是否能進(jìn)行操作施籍;可以把 Realm 看成 DataSource居扒,即安全數(shù)據(jù)源。

  • [圖片上傳中...(Authentication.png-3b5e8d-1563620187017-0)]
    :身份認(rèn)證 / 登錄丑慎,驗(yàn)證用戶是不是擁有相應(yīng)的身份喜喂;

  • Authorization:授權(quán),即權(quán)限驗(yàn)證竿裂,驗(yàn)證某個(gè)已認(rèn)證的用戶是否擁有某個(gè)權(quán)限玉吁;即判斷用戶是否能做事情,常見(jiàn)的如:驗(yàn)證某個(gè)用戶是否擁有某個(gè)角色腻异〗保或者細(xì)粒度的驗(yàn)證某個(gè)用戶對(duì)某個(gè)資源是否具有某個(gè)權(quán)限;

登陸流程

具體的登陸流程如下:


Authentication.png

1.從FormAuthenticationFilter的executeLogin()方法開(kāi)始悔常,把post表單提交的用戶名稱和密碼封裝為token影斑,調(diào)用subject.login(token);
2.調(diào)用AuthenticatingSecurityManager.authenticate() 會(huì)調(diào)用securityManage配置的authenticator的authenticate()方法给赞;
3.AbstractAuthenticator是抽象類,具體的實(shí)現(xiàn)還是調(diào)用ModularRealmAuthenticator.doAuthenticate(),這個(gè)方法主要是判斷當(dāng)前配置的登陸realm是單個(gè)還是多個(gè)矫户;
4.單個(gè)realms調(diào)用return doSingleRealmAuthentication();
多個(gè)realms調(diào)用return doMultiRealmAuthentication();
5.單個(gè)realm的doGetAuthenticationInfo()片迅,由業(yè)務(wù)去實(shí)現(xiàn)根據(jù)用戶名查詢用戶信息,也就是認(rèn)證的基礎(chǔ)流程吏垮。具體的認(rèn)證密碼流程統(tǒng)一是在realm的父類AuthenticatingRealm實(shí)現(xiàn).

至此障涯,整個(gè)認(rèn)證流程已經(jīng)結(jié)束。

實(shí)踐記錄

  • 多realm的登陸多了一個(gè)流程就是需要根據(jù)配置的策略判斷那種方式才算登陸成功膳汪。多realm常用于多種登陸方式。下面分別列出幾種不同的認(rèn)證策略:
    1.AtLeastOneSuccessfulStrategy:至少一條滿足的情況九秀,返回所有 Realm 身份驗(yàn)證成功的認(rèn)證信息遗嗽,也就是權(quán)限。這是默認(rèn)的策略鼓蜒;
    2.FirstSuccessfulStrategy第一條滿足的情況痹换,只返回第一個(gè) Realm 身份驗(yàn)證成功的認(rèn)證信息;
    3.AllSuccessfulStrategy所有 Realm 驗(yàn)證成功才算成功都弹,且返回所有 Realm 身份驗(yàn)證成功的認(rèn)證信息娇豫,如果有一個(gè)失敗就失敗了。

  • 多個(gè)realm登陸畅厢,在實(shí)踐中極端經(jīng)常需要在realm的doGetAuthenticationInfo認(rèn)證方法中拋出業(yè)務(wù)異常冯痢,但是會(huì)被shiro內(nèi)部消化,所以需要在ModularRealmAuthenticator的子類復(fù)寫doMultiRealmAuthentication

參考

即刻學(xué)院:身份驗(yàn)證
apache shiro: Apache Shiro Authentication

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末框杜,一起剝皮案震驚了整個(gè)濱河市浦楣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咪辱,老刑警劉巖振劳,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異油狂,居然都是意外死亡历恐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門专筷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弱贼,“玉大人,你說(shuō)我怎么就攤上這事仁堪∠ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵弦聂,是天一觀的道長(zhǎng)鸟辅。 經(jīng)常有香客問(wèn)我氛什,道長(zhǎng),這世上最難降的妖魔是什么匪凉? 我笑而不...
    開(kāi)封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任枪眉,我火速辦了婚禮,結(jié)果婚禮上再层,老公的妹妹穿的比我還像新娘贸铜。我一直安慰自己,他們只是感情好聂受,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布蒿秦。 她就那樣靜靜地躺著,像睡著了一般蛋济。 火紅的嫁衣襯著肌膚如雪棍鳖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天碗旅,我揣著相機(jī)與錄音渡处,去河邊找鬼。 笑死祟辟,一個(gè)胖子當(dāng)著我的面吹牛医瘫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旧困,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼醇份,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叮喳?” 一聲冷哼從身側(cè)響起被芳,我...
    開(kāi)封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馍悟,沒(méi)想到半個(gè)月后畔濒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锣咒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年侵状,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅整。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趣兄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悼嫉,到底是詐尸還是另有隱情艇潭,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蹋凝,受9級(jí)特大地震影響鲁纠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳍寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一改含、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迄汛,春花似錦捍壤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至睹逃,卻和暖如春帜慢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唯卖。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躬柬,地道東北人拜轨。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像允青,于是被迫代替她去往敵國(guó)和親橄碾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348