青檸果
于 2022-08-03 22:04:20
目錄
1.shiro安全框架
1.1 什么是權(quán)限管理
1.2 什么是身份認(rèn)證
1.3 什么是授權(quán)
1.4 認(rèn)證授權(quán)框架有哪些
2.使用shiro完成認(rèn)證工作
2.1 shiro中認(rèn)證的關(guān)鍵對象
2.2 認(rèn)證流程
2.3 項目代碼
2.3.1 依賴
2.3.2 創(chuàng)建ini文件
2.3.3 測試代碼
2.4 認(rèn)證的原理
3.授權(quán)
3.1 修改ini文件
3.2 修改代碼
Apache Shiro 是一個強(qiáng)大易用的 Java 安全框架,提供了認(rèn)證、授權(quán)、加密和session會話管理等功能,對于任何一個應(yīng)用程序,Shiro 都可以提供全面的安全管理服務(wù)。并且相對于其他安全框架spring security,Shiro 要簡單的多。
Shiro是apache旗下一個開源框架,它將軟件系統(tǒng)的安全認(rèn)證相關(guān)的功能抽取出來,實現(xiàn)用戶身份認(rèn)證,權(quán)限授權(quán)、加密、會話管理等功能,組成了一個通用的安全認(rèn)證框架。
Shiro可以非常容易的開發(fā)出足夠好的應(yīng)用,其不僅可以用在JavaSE環(huán)境,也可以用在JavaEE環(huán)境。Shiro可以幫助我們完成:認(rèn)證、授權(quán)、加密、會話管理、與Web集成、緩存等。
1.1 什么是權(quán)限管理
基本上涉及到用戶參與的系統(tǒng)都要進(jìn)行權(quán)限管理,權(quán)限管理屬于系統(tǒng)安全的范疇,權(quán)限管理實現(xiàn)對用戶訪問系統(tǒng)的控制,按照安全規(guī)則或者安全策略控制用戶可以訪問而且只能訪問自己被授權(quán)的資源。
權(quán)限管理包括用戶身份認(rèn)證和授權(quán)兩部分,簡稱認(rèn)證授權(quán)。對于需要訪問控制的資源用戶首先經(jīng)過身份認(rèn)證,認(rèn)證通過后用戶具有該資源的訪問權(quán)限方可訪問。
1.2 什么是身份認(rèn)證
身份認(rèn)證,就是判斷一個用戶是否為合法用戶的處理過程。最常用的簡單身份認(rèn)證方式是系統(tǒng)通過核對用戶輸入的用戶名和口令,看其是否與系統(tǒng)中存儲的該用戶的用戶名和口令一致,來判斷用戶身份是否正確。對于采用指紋等系統(tǒng),則出示指紋;對于硬件Key等刷卡系統(tǒng),則需要刷卡。
1.3 什么是授權(quán)
授權(quán),即訪問控制,控制誰能訪問哪些資源。主體進(jìn)行身份認(rèn)證后需要分配權(quán)限方可訪問系統(tǒng)的資源,對于某些資源沒有權(quán)限是無法訪問的 .
1.4 認(rèn)證授權(quán)框架有哪些
shiro框架和spring security框架 這款框架是現(xiàn)在市面比較流行。
2.使用shiro完成認(rèn)證工作
2.1 shiro中認(rèn)證的關(guān)鍵對象
Subject:主體訪問系統(tǒng)的用戶,主體可以是用戶、程序等,進(jìn)行認(rèn)證的都稱為主體;
Principal:身份信息----賬號是主體(subject)進(jìn)行身份認(rèn)證的標(biāo)識,標(biāo)識必須具有唯一性,如用戶名、手機(jī)號、郵箱地址等,一個主體可以有多個身份,但是必須有一個主身份(Primary Principal)。
credential:憑證信息---密碼是只有主體自己知道的安全信息,如密碼、證書等。
2.2 認(rèn)證流程
2.3 項目代碼
1.先不用數(shù)據(jù)庫來進(jìn)行身份認(rèn)證,--我們ini文件,window系統(tǒng)文件,該文件中可以存放賬號和密碼。
(1) 創(chuàng)建一個maven java工程
2.3.1 依賴
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.0</version>
</dependency>
2.3.2 創(chuàng)建ini文件
2.3.3 測試代碼
public class Test01 {
public static void main(String[] args) {
//1.獲取SecurityManager對象
DefaultSecurityManager securityManager=new DefaultSecurityManager();
//2.讀取ini文件
IniRealm iniRealm=new IniRealm("classpath:shiro.ini");
//3。設(shè)置securityManager的realm
securityManager.setRealm(iniRealm);
//4.設(shè)置securityManager上下文生效
SecurityUtils.setSecurityManager(securityManager);
//5.獲取subject的主體對象
Subject subject=SecurityUtils.getSubject();
try{
//UsernamePasswordToken作用是封裝你輸入的賬號和密碼 是客戶自己輸入的 用來進(jìn)行比較與realm
UsernamePasswordToken token=new UsernamePasswordToken("admin","123456");
//拋出異常 比對shiro中realm和自己的對比,如果一致則登錄成功,不一致則登錄失敗
subject.login(token);
System.out.println("登陸成功");
}catch(Exception e){
e.printStackTrace();
System.out.println("登陸失敗");
}
}
}
2.4 認(rèn)證的原理
Subject: 主題 登錄信息提交給SecurityManager --->認(rèn)證器Authenticator---->根據(jù)你的realm提供的數(shù)據(jù)進(jìn)行相關(guān)的認(rèn)證。 realm---與數(shù)據(jù)源交互的類。
3.授權(quán)
3.1 修改ini文件
3.2 修改代碼
public class Test01 {
public static void main(String[] args) {
//1.獲取SecurityManager對象
DefaultSecurityManager securityManager=new DefaultSecurityManager();
//2.讀取ini文件
IniRealm iniRealm=new IniRealm("classpath:shiro.ini");
//3。設(shè)置securityManager的realm
securityManager.setRealm(iniRealm);
//4.設(shè)置securityManager上下文生效
SecurityUtils.setSecurityManager(securityManager);
//5.獲取subject的主體對象
Subject subject=SecurityUtils.getSubject();
try{
//UsernamePasswordToken作用是封裝你輸入的賬號和密碼 是客戶自己輸入的 用來進(jìn)行比較與realm
UsernamePasswordToken token=new UsernamePasswordToken("admin","123456");
//拋出異常 比對shiro中realm和自己的對比,如果一致則登錄成功,不一致則登錄失敗
subject.login(token);
System.out.println("登陸成功");
}catch(Exception e){
e.printStackTrace();
System.out.println("登陸失敗");
}
System.out.println("=========================登陸后===========================");
boolean authenticated = subject.isAuthenticated();
if(authenticated){
//判斷當(dāng)前登錄者是否具有user:query權(quán)限
boolean permitted = subject.isPermitted("user:update");
System.out.println(permitted);
//從角色角度
boolean role1 = subject.hasRole("role1");
System.out.println(role1);
}else {
System.out.println("請先認(rèn)證");
}
}
}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。