一、Shiro認(rèn)證過(guò)程
1、收集實(shí)體/憑據(jù)信息
UsernamePasswordToken支持最常見(jiàn)的用戶名/密碼的認(rèn)證機(jī)制。同時(shí),由于它實(shí)現(xiàn)了RememberMeAuthenticationToken接口,我們可以通過(guò)令牌設(shè)置“記住我”的功能。
但是,“已記住”和“已認(rèn)證”是有區(qū)別的:
已記住的用戶僅僅是非匿名用戶,你可以通過(guò)subject.getPrincipals()獲取用戶信息。但是它并非是完全認(rèn)證通過(guò)的用戶,當(dāng)你訪問(wèn)需要認(rèn)證用戶的功能時(shí),你仍然需要重新提交認(rèn)證信息。
這一區(qū)別可以參考亞馬遜網(wǎng)站,網(wǎng)站會(huì)默認(rèn)記住登錄的用戶,再次訪問(wèn)網(wǎng)站時(shí),對(duì)于非敏感的頁(yè)面功能,頁(yè)面上會(huì)顯示記住的用戶信息,但是當(dāng)你訪問(wèn)網(wǎng)站賬戶信息時(shí)仍然需要再次進(jìn)行登錄認(rèn)證。
2、提交實(shí)體/憑據(jù)信息
收集了實(shí)體/憑據(jù)信息之后,我們可以通過(guò)SecurityUtils工具類,獲取當(dāng)前的用戶,然后通過(guò)調(diào)用login方法提交認(rèn)證。
3、認(rèn)證處理
如果login方法執(zhí)行完畢且沒(méi)有拋出任何異常信息,那么便認(rèn)為用戶認(rèn)證通過(guò)。之后在應(yīng)用程序任意地方調(diào)用SecurityUtils.getSubject() 都可以獲取到當(dāng)前認(rèn)證通過(guò)的用戶實(shí)例,使用subject.isAuthenticated()判斷用戶是否已驗(yàn)證都將返回true.
相反,如果login方法執(zhí)行過(guò)程中拋出異常,那么將認(rèn)為認(rèn)證失敗。Shiro有著豐富的層次鮮明的異常類來(lái)描述認(rèn)證失敗的原因,如代碼示例。
二、登出操作
登出操作可以通過(guò)調(diào)用subject.logout()來(lái)刪除你的登錄信息,如:
當(dāng)執(zhí)行完登出操作后,Session信息將被清空,subject將被視作為匿名用戶。
三、認(rèn)證內(nèi)部處理機(jī)制
以上,是Shiro認(rèn)證在應(yīng)用程序中的處理過(guò)程,下面將詳細(xì)解說(shuō)Shiro認(rèn)證的內(nèi)部處理機(jī)制。
新聞熱點(diǎn)
疑難解答
圖片精選