Shiro 之使用
一、shiro概述
shiro 是一個(gè)功能強(qiáng)大且易于使用的Java安全框架.
shiro官網(wǎng):http://shiro.apache.org/
Github地址:https://github.com/apache/shiro
shiro官方架構(gòu)圖

二、主要名詞解析
Subject
subject記錄了當(dāng)前操作用戶,將用戶的概念理解為當(dāng)前操作的主體SecurityManager
SecurityManager即安全管理器,對全部的subject進(jìn)行安全管理,它是shiro的核心,負(fù)責(zé)對所有的subject進(jìn)行安全管理。Authenticator
Authenticator即認(rèn)證器,對用戶身份進(jìn)行認(rèn)證,Authenticator是一個(gè)接口,shiro提供ModularRealmAuthenticator實(shí)現(xiàn)類,也可以自定義認(rèn)證器。Authorizer
用戶通過認(rèn)證器認(rèn)證通過,在訪問功能時(shí)需要通過授權(quán)器判斷用戶是否有此功能的操作權(quán)限。Realm
securityManager進(jìn)行安全認(rèn)證需要通過Realm獲取用戶權(quán)限數(shù)據(jù)SessionManager
shiro框架定義了一套會話管理,它不依賴web容器的sessionSessionDAO
是對session會話操作的一套接口CacheManager
將用戶權(quán)限數(shù)據(jù)存儲在緩存,這樣可以提高性能Cryptography
shiro提供了一套加密/解密的組件,方便開發(fā)。比如提供常用的散列、加/解密等功能。
三、十分鐘快速入門
簡單的運(yùn)行一個(gè)dmeo
一、導(dǎo)入maven依賴
<dependency>
????<groupId>org.apache.shirogroupId>
????<artifactId>shiro-coreartifactId>
????<version>1.7.1version>
dependency>
二、通過.ini 文件初始化一個(gè)Realm
配置文件:名稱隨意,以?
.ini?結(jié)尾,放在?resources?目錄下
[users]
admin=admin321
lilei=lilei321
三、運(yùn)行代碼
package?com.live.shiro;
import?org.apache.shiro.SecurityUtils;
import?org.apache.shiro.authc.AuthenticationException;
import?org.apache.shiro.authc.IncorrectCredentialsException;
import?org.apache.shiro.authc.UnknownAccountException;
import?org.apache.shiro.authc.UsernamePasswordToken;
import?org.apache.shiro.mgt.DefaultSecurityManager;
import?org.apache.shiro.realm.text.IniRealm;
import?org.apache.shiro.subject.Subject;
public?class?QuickstartShiro?{
????public?static?void?main(String[]?args)?{
????????//?創(chuàng)建默認(rèn)的安全管理器
????????DefaultSecurityManager?securityManager?=?new?DefaultSecurityManager();
????????//?通過.ini文件創(chuàng)建給安全管理器設(shè)置默認(rèn)的Realm
????????securityManager.setRealm(new?IniRealm("classpath:shiro-config.ini"));
????????//?全局安全工具類,設(shè)置安全管理器進(jìn)行認(rèn)證
????????SecurityUtils.setSecurityManager(securityManager);
????????//?創(chuàng)建令牌
????????UsernamePasswordToken?token?=?new?UsernamePasswordToken("admin",?"admin321");
????????//?得到當(dāng)前的?subject,也就是當(dāng)前的用戶
????????Subject?subject?=?SecurityUtils.getSubject();
????????try{
????????????//?打印是否授權(quán)
????????????System.out.println(subject.isAuthenticated());
????????????//?用戶登陸認(rèn)證
????????????subject.login(token);
????????????//?true?登陸之后就是授權(quán)
????????????System.out.println(subject.isAuthenticated());
????????}catch?(UnknownAccountException?e){
????????????System.out.println("用戶不存在");
????????}catch?(IncorrectCredentialsException?e){
????????????System.out.println("密碼錯(cuò)誤");
????????}catch?(AuthenticationException?e){
????????????System.out.println("認(rèn)證失敗");
????????????e.printStackTrace();
????????}
????}
}運(yùn)行發(fā)現(xiàn)執(zhí)行
subject.login(token)?之后,認(rèn)證成功了。所以我們在
subject.login(token)通過debug進(jìn)入到里面的實(shí)現(xiàn)調(diào)用到
DelegatingSubject.login()->?DefaultSecurityManager.login()…->AuthenticatingRealm.doGetAuthenticationInfo()->SimpleAccountRealm.doGetAuthenticationInfo()也就是最終調(diào)用的認(rèn)證就是
doGetAuthenticationInfo()方法。
source:?//rstyro.github.io/blog/2020/04/18/shiro之使用

喜歡,在看
