什么是Shiro
Apache Shiro是一個強大且易用的Java安全框架,執(zhí)行身份驗證轨奄、授權(quán)挽铁、密碼和會話管理袋倔。使用Shiro的易于理解的API,您可以快速坦辟、輕松地獲得任何應(yīng)用程序,從最小的移動應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序。
三個核心組件
Subject, SecurityManager 和 Realms.
①Subject:即“當(dāng)前操作用戶”声离。但是芒炼,在Shiro中,Subject這一概念并不僅僅指人术徊,也可以是第三方進程本刽、后臺帳戶(Daemon Account)或其他類似事物。它僅僅意味著“當(dāng)前跟軟件交互的東西”。但考慮到大多數(shù)目的和用途盅安,你可以把它認為是Shiro的“用戶”概念唤锉。Subject代表了當(dāng)前用戶的安全操作,SecurityManager則管理所有用戶的安全操作别瞭。
②SecurityManager:它是Shiro框架的核心窿祥,典型的Facade模式,Shiro通過SecurityManager來管理內(nèi)部組件實例蝙寨,并通過它來提供安全管理的各種服務(wù)晒衩。
③Realm: Realm充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說墙歪,當(dāng)對用戶執(zhí)行認證(登錄)和授權(quán)(訪問控制)驗證時听系,Shiro會從應(yīng)用配置的Realm中查找用戶及其權(quán)限信息。
登錄認證過程簡述
①調(diào)用subject.login方法進行登錄虹菲,其會自動委托給securityManager,login方法進行登錄;
②securityManager通過 Authenticator(認證器)進行認證
③Authenticator的實現(xiàn)ModularRealmAuthenticaton調(diào)用realm從ini配置文件取用戶真實的賬號和密碼靠胜,這里使用的是IniRealm ( shiro自帶,相當(dāng)于數(shù)據(jù)源) ;
具體實現(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>
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 {
@Test
public 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)前運行環(huán)境中,讓系統(tǒng)隨時可以訪問SecurityManager對象
SecurityUtils.setSecurityManager(securityManager);
//創(chuàng)建登錄主體 注意:此時主體沒有經(jīng)過驗證霎褐,僅僅是個空的對象
Subject subject = SecurityUtils.getSubject();
//綁定主體登陸的身份址愿、憑證 即賬號密碼
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");
//主體登陸
try{
subject.login(token);
}catch (Exception e){
//拋錯誤
}
//登陸判斷
System.out.println("登錄結(jié)果" + subject.isAuthenticated() );
//登出判斷
subject.logout();
System.out.println("登出結(jié)果" + subject.isAuthenticated());
}
}
結(jié)果:
源碼分析
①我們在登錄操作時打好斷點,debug運行④點進去看一下娘纷,我們發(fā)現(xiàn)securitymanager將認證任務(wù)委托給了認證器,由認證器執(zhí)行認證方法
看不懂棉圈,繼續(xù)進去看看,我們看到他先把我們的token包裝成了 UsernamePasswordToken的形式 然后執(zhí)行了getuser()參數(shù)是我們頁面?zhèn)鬟M來的token的name
好了整個過程大概就是這個樣子啦!I细凇福荸!