簡(jiǎn)單概念
在上一章節(jié)氮惯,我們探討了Filter的執(zhí)行流程镜遣,接下來(lái)仔細(xì)分析用戶的登陸流程。
先看看shiro官方給出的一張圖:
再看幾個(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)限;
登陸流程
具體的登陸流程如下:
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