更新時間:2021-07-29 16:47:56 來源:動力節(jié)點 瀏覽1422次
Shiro三個核心組件:Subject,SecurityManager和Realms.
Subject:即“當前操作用發(fā)戶”。但是,在Shiro中,Subject這一概念并不僅僅指人,也可以是第三方進程、后臺帳戶(Daemon Account)或其他類似事物。它僅僅意味著“當前跟軟件交互的東西”。但考慮到大多數(shù)目的和用途,你可以把它認為是Shiro的“用戶”概念。Subject代表了當前用戶的安全操作,SecurityManager則管理所有用戶的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內(nèi)部組件實例,并通過它來提供安全管理的各種服務。
Realm:Realm充當了Shiro與應用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說,當對用戶執(zhí)行認證(登錄)和授權(quán)(訪問控制)驗證時,Shiro會從應用配置的Realm中查找用戶及其權(quán)限信息。
從這個意義上講,Realm實質(zhì)上是一個安全相關(guān)的DAO:它封裝了數(shù)據(jù)源的連接細節(jié),并在需要時將相關(guān)數(shù)據(jù)提供給Shiro。當配置Shiro時,你必須至少指定一個Realm,用于認證和(或)授權(quán)。配置多個Realm是可以的,但是至少需要一個。
Shiro內(nèi)置了可以連接大量安全數(shù)據(jù)源(又名目錄)的Realm,如LDAP、關(guān)系數(shù)據(jù)庫(JDBC)、類似INI的文本配置資源以及屬性文件等。如果缺省的Realm不能滿足需求,你還可以插入代表自定義數(shù)據(jù)源的自己的Realm實現(xiàn)。
Hello Shiro
導入slf4j-api.jar,slf4j-logj12.jar,log4j.jar,shiro-core.jar包
在classpath下創(chuàng)建shiro.ini文件,文件內(nèi)容如下表示用戶名和密碼
[users]
shiro = shiro
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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.Assert;
import org.junit.Test;
public class ShiroTest {
@Test
public void test() {
// 1、獲取SecurityManager工廠,此處使用Ini配置文件初始化SecurityManager
Factory<SecurityManager> factroy = new IniSecurityManagerFactory("classpath:shiro.ini");
// 2、得到SecurityManager實例并綁定給SecurityUtils
SecurityManager securityManager = factroy.getInstance();
SecurityUtils.setSecurityManager(securityManager);
// 3、得到Subject及創(chuàng)建用戶名/密碼身份驗證Token(即用戶身份/憑證)
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("shiro", "shiro");
try {
// 4、登錄,即身份驗證
subject.login(token);
} catch (AuthenticationException e) {
// 5、身份驗證失敗
e.printStackTrace();
}
Assert.assertEquals(true, subject.isAuthenticated()); //斷言用戶已經(jīng)登錄
// 6、退出
subject.logout();
}
}
1.需要讀取classpath下的shiro.ini配置文件,并通過工廠類創(chuàng)建SecurityManage對象,最終將其放入SecurityUtils中,方便Shiro框架隨時獲取
2.通過SecurityUtils獲取Subject(主體)對象,其實就是當前用戶,只是叫法不同罷了
3.首先使用一個Username與Password來創(chuàng)建一個UsernamePasswordToken對象,然后通過這個Token對象調(diào)用Subject的login方法進行身份認證
4.當?shù)卿浭。梢允褂肁uthenticationException來捕獲這個異常;當?shù)卿洺晒梢哉{(diào)用Subject對象的getPrincipal方法來獲取Username,此時Shiro已經(jīng)創(chuàng)建了一個Session
5.最后還是通過Subject對象的logout來注銷本次Sesson
只需要知道以上幾個Shiro核心成員的基本用法,Shiro就是你的了
其實,Shiro的調(diào)用流程也不難理解,如下圖

通過Subject調(diào)用SecurityManager,通過SecurityManager調(diào)用Realm,這個Realm說白了其實就是提供用戶信息的數(shù)據(jù)源,例如上例子中的shiro.ini就是配置用戶信息的一種Realm方式,在Shiro中叫做IniRealm,除此之外,還提供了其他幾種Realm:有PropertiesRealm、JdbcRealm、JndiLdapRealm、ActiveDirectoryRealm等,當然也可以定制Realm來滿足業(yè)務需求。
在Web開發(fā)中使用Shiro
在web開發(fā)中,還需要導入shiro-web.jar包,然后在web.xml中添加一個Listener與一個Filter。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 添加Shiro監(jiān)聽器 -->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoader-Listener</listener-class>
</listener>
<!-- 添加Shiro過濾器 -->
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
實際上就是通過EnvironmentLoaderListener這個監(jiān)聽器來初始化SecurityManager,并通過ShiroFilter來完成認證認證與授權(quán)。
以上就是動力節(jié)點小編介紹的"Shiro權(quán)限控制框架",希望對大家有幫助,想了解更多可查看Shiro視頻教程。動力節(jié)點在線學習教程,針對沒有任何Java基礎(chǔ)的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關(guān)注一下。