一、Shiro是基於RBAC: 基於角色的權限管理
簡單理解爲:誰扮演什麼角色, 被允許做什麼操作
用戶對象:user: 當前操作用戶
角色對象:role:表示權限操作許可權的集合
權限對象:permission: 資源操作許可權
例子:張三(user) 下載(permission)一個高清無碼的種子(資源), 需要VIP權限(role)
張三--->普通用戶--->授權---->VIP用戶----->下載種子
二、授權三種方式:
三、權限設置與驗證
項目結構:
先理解一個概念:
在ini文件中用戶、角色、權限的配置規則是:“用戶名=密碼,角色1,角色2...” “角色=權限1,權限2...”,首先根據用戶名找角色,再根據角色找權限,角色是權限集合。
權限字符串的規則是:“資源標識符:操作:資源實例標識符”,意思是對哪個資源的哪個實例具有什麼操作,“:”是資源/操作/實例的分割符,權限字符串也可以使用*通配符。
例子:
用戶創建權限:user:create,或user:create:*
用戶修改實例001的權限:user:update:001
用戶實例001的所有權限:user:*:001
一般而已,我們操作只需要關注前面兩節:
資源:操作 :
*:* : 所有資源的所有操作權限--->admin
1)ini文件配置:
[users]
#模擬數據庫用戶列表,賬號=密碼,此用戶有role1和role2兩個角色
zhangsan=666,role1,role2
lisi=888,role2
[roles]
#角色role1對資源user擁有create,update權限
role1=user:create,user:update
role2=user:create,user:delete
role3=usser:create
2)測試類:
public class ShiroTest {
public static void main(String[] args) {
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro-permission.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "666");
subject.login(token);
System.out.println("登陸是否成功" + subject.isAuthenticated());
//判斷當前用戶是否有某個角色的權限
System.out.println(subject.hasRole("role1"));
//判斷用戶是否擁有一些角色權限,true則全有,false則不全部擁有
System.out.println(subject.hasAllRoles(Arrays.asList("role1","role2")));
System.out.println(subject.hasAllRoles(Arrays.asList("role1","role2","role3")));
//判斷用戶是否擁有一些角色權限,返回boolean數組,true則代表有某個權限
System.out.println(
Arrays.toString(subject.hasRoles(Arrays.asList("role1","role2","role3" )))
);
//如果有該角色權限,有則無操作,如果無則報錯
subject.checkRole("role1");
System.out.println("----------------------");
//判斷用戶是否有某個權限
System.out.println(subject.isPermitted("user:create"));
//判斷用戶是否有一些權限,都有則返回true,不全有則返回false
System.out.println(subject.isPermittedAll("user:create","user:update"));
System.out.println(subject.isPermittedAll("user:list","user:update"));
//判斷用戶是否擁有一些權限,返回數組
System.out.println(
Arrays.toString(subject.isPermitted("user:list","user:delete"))
);
//判斷用戶是否擁有權限,有則無操作,如果無則報錯
subject.checkPermission("user:list");
}
}
3)控制檯輸出: