Shiro角色權限和權限添加與判斷操作(四)

一、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)控制檯輸出:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章