shiro学习(4):shiro认证流程
Shiro登錄校驗(yàn)流程實(shí)現(xiàn)與分析
什么是Shiro
Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會話管理。使用Shiro的易于理解的API,您可以快速、輕松地獲得任何應(yīng)用程序,從最小的移動(dòng)應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序。
三個(gè)核心組件
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)部組件實(shí)例,并通過它來提供安全管理的各種服務(wù)。
③Realm: Realm充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說,當(dāng)對用戶執(zhí)行認(rèn)證(登錄)和授權(quán)(訪問控制)驗(yàn)證時(shí),Shiro會從應(yīng)用配置的Realm中查找用戶及其權(quán)限信息。
登錄認(rèn)證過程簡述
①調(diào)用subject.login方法進(jìn)行登錄,其會自動(dòng)委托給securityManager,login方法進(jìn)行登錄;
②securityManager通過 Authenticator(認(rèn)證器)進(jìn)行認(rèn)證
③Authenticator的實(shí)現(xiàn)ModularRealmAuthenticaton調(diào)用realm從ini配置文件取用戶真實(shí)的賬號和密碼,這里使用的是IniRealm ( shiro自帶,相當(dāng)于數(shù)據(jù)源) ;
?
④IniRealm先根據(jù)token中的賬號去ini中找該賬號,如果找不到則給ModularRealmAuthenticator返回null ,如果找到則匹配密碼,匹配密碼成功則認(rèn)證通過。
image.png
具體實(shí)現(xiàn)
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version></dependency>image.png
package com.swl;import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.junit.Test;/*** <Description>ShiroTest<br>** @author DaShi<br>* @CreateDate 2019-02-15 09:43 <br>*/ public class ShiroTest {@Testpublic void loginTest() throws Exception{//創(chuàng)建IniSecurityManager工程對象:加載配置文件Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");//通過工廠對象創(chuàng)建SecurityManager對象SecurityManager securityManager = factory.getInstance();// 將SecurityManager綁定到當(dāng)前運(yùn)行環(huán)境中,讓系統(tǒng)隨時(shí)可以訪問SecurityManager對象SecurityUtils.setSecurityManager(securityManager);//創(chuàng)建登錄主體 注意:此時(shí)主體沒有經(jīng)過驗(yàn)證,僅僅是個(gè)空的對象Subject subject = SecurityUtils.getSubject();//綁定主體登陸的身份、憑證 即賬號密碼UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");//主體登陸try{subject.login(token);}catch (Exception e){//拋錯(cuò)誤}//登陸判斷System.out.println("登錄結(jié)果" + subject.isAuthenticated() );//登出判斷subject.logout();System.out.println("登出結(jié)果" + subject.isAuthenticated());} }結(jié)果:
?
image.png
源碼分析
?
?
①我們在登錄操作時(shí)打好斷點(diǎn),debug運(yùn)行
image.png
?
②我們進(jìn)入到subject主體的實(shí)現(xiàn)類中,注意標(biāo)記部分,subject將登錄操作委托給了securitymanager,參數(shù)除了頁面?zhèn)魅氲膖oken以外還有subject主體
image.png
③進(jìn)入到securitymanager實(shí)現(xiàn)類中,開始執(zhí)行認(rèn)證方法
image.png
④點(diǎn)進(jìn)去看一下,我們發(fā)現(xiàn)securitymanager將認(rèn)證任務(wù)委托給了認(rèn)證器,由認(rèn)證器執(zhí)行認(rèn)證方法
image.png
?
⑤我們進(jìn)入到認(rèn)證方法中
image.png
⑥繼續(xù)執(zhí)行doAuthenticate,我們發(fā)現(xiàn)這里面有個(gè)realm,他是啥呢?
image.png
我們看到realms這個(gè)集合里面其實(shí)就是我們之前加載的realms.ini中的內(nèi)容
image.png
⑦因?yàn)槲覀冎挥幸粋€(gè)realm,所以進(jìn)入了true條件中,這時(shí)我們剛才標(biāo)記出的AuthenticationInfo出現(xiàn)了,看看他是啥
image.png
點(diǎn)進(jìn)去看看
image.png
看不懂,繼續(xù)進(jìn)去看看,我們看到他先把我們的token包裝成了 UsernamePasswordToken的形式 然后執(zhí)行了getuser()參數(shù)是我們頁面?zhèn)鬟M(jìn)來的token的name
image.png
⑧我們看一下里面是什么,是通過頁面?zhèn)魅氲哪莻€(gè)用戶名,去我們剛才realm里面的user列表去查找有沒有這個(gè)用戶 如果找到了,將realm中該用戶信息返回上一層
image.png
?
⑨這時(shí)我們可以看到account中包含了張三的信息
image.png
⑩接下來我們繼續(xù)返回上一層,因?yàn)槲覀円呀?jīng)在realm中找到了頁面輸入的token的用戶名,下一步進(jìn)行密碼驗(yàn)證
image.png
密碼驗(yàn)證就很簡單了,重點(diǎn)就是這個(gè)判斷
image.png
其實(shí)就是把我們剛才取得的那個(gè)realm中的張三的密碼和我們頁面?zhèn)魅氲拿艽a比較
image.png
好了整個(gè)過程大概就是這個(gè)樣子啦!!!
總結(jié)
以上是生活随笔為你收集整理的shiro学习(4):shiro认证流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驱动开发入门 - 之二:Win7-x64
- 下一篇: hashmap 从头到尾_如何从头到尾设