1.授權(quán):給身份認(rèn)證通過(guò)的人膘融,授予他可以訪問(wèn)某些資源的權(quán)限坑夯。
2.權(quán)限粒度:分為粗粒度和細(xì)粒度喂窟。
粗粒度:對(duì)user的crud庐椒。也就是說(shuō)通常對(duì)表的操作椒舵。
細(xì)粒度:是對(duì)記錄的操作,如只允許查詢id為1的user的工資约谈。
shiro一般管理的是粗粒度的權(quán)限笔宿,比如:菜單,按鈕棱诱,url泼橘。
一般細(xì)粒度的權(quán)限是通過(guò)業(yè)務(wù)來(lái)控制的。
3.角色:權(quán)限的集合迈勋。
4.權(quán)限表示規(guī)則: 資源:操作:實(shí)例炬灭。可以用通配符表示
如: user:add 表示對(duì)user有添加的權(quán)限
user:* 表示對(duì)user具有所有權(quán)限
user:delete:100 表示對(duì)user標(biāo)識(shí)為100的記錄有刪除權(quán)限
5.shiro中的權(quán)限流程
微信截圖_20190703094542.png
6.編碼實(shí)現(xiàn)
ini配置文件:
[main]
[users]
zhangsan=123,role1
lisi=1234,role2
[roles]
role1=user:add,user:update,user:delete
role2=user:*
shiro測(cè)試代碼:
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 java.util.Arrays;
public class shouquan_demo {
public static void main(String[] args) {
//1粪躬、獲取SecurityManager工廠,此處使用Ini配置文件初始化SecurityManager
Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:quanxian.ini");
//2昔穴、得到SecurityManager實(shí)例 并綁定給SecurityUtils
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//3镰官、得到Subject及創(chuàng)建用戶名/密碼身份驗(yàn)證Token(即用戶身份/憑證)
Subject subject = SecurityUtils.getSubject();
//4、假如登陸用戶名密碼為zhangsan=123吗货,這個(gè)地方的zhangsan泳唠、123表示用戶在網(wǎng)頁(yè)登陸時(shí)輸入的賬號(hào)密碼,而shiro.ini文件中的信息相當(dāng)于數(shù)據(jù)庫(kù)中的存放的信息
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");
try{
//進(jìn)行用戶身份驗(yàn)證
subject.login(token);
//通過(guò)Subject來(lái)判斷是否登陸成功
if(subject.isAuthenticated()){
System.out.println("用戶登陸成功");
}
//先驗(yàn)證身份在進(jìn)行權(quán)限驗(yàn)證
//基于角色的授權(quán)
boolean f = subject.hasRole("role1");
System.out.println(f);
//判斷是否具有多個(gè)角色
boolean[] booleans = subject.hasRoles(Arrays.asList("role1", "role2"));
System.out.println(Arrays.toString(booleans));
//可以通過(guò)checkRole來(lái)檢查宙搬,如果不具備該角色會(huì)報(bào)錯(cuò)拋出異常
//subject.checkRole("role1");
//同時(shí)檢查多個(gè)角色
//subject.checkRoles("role1","role2");
//基于資源的授權(quán)
f=subject.isPermitted("user:delete");
System.out.println(f);
//判斷是否具有多個(gè)權(quán)限
f=subject.isPermittedAll("user:add","user:update","user:delete");
System.out.println(f);
//check方法檢查授權(quán)如果沒(méi)有拋異常
subject.checkPermission("user:dd");
}catch (AuthenticationException e){
e.printStackTrace();
System.out.println("用戶名或密碼不正確");
}
}
}
7.shiro中的權(quán)限檢查方式有3種:
a)編程式
if(subject.hasRole("管理員")){
操作某些資源
}
b)注解式
//在執(zhí)行指定的方法時(shí)笨腥,會(huì)檢測(cè)是否具有該權(quán)限
@RequiresRoles("管理員")
public void list(){
查詢數(shù)據(jù)
}
c)標(biāo)簽
<shiro:hasPermission name="user:update">
<a href="#">更新</a>
</shiro:hasPermission>