Shiro 授權


 

Shiro 授權:

  參考鏈接:http://jinnianshilongnian.iteye.com/blog/2020017

  授權,也稱訪問控制,即在應用中控制用戶可以訪問哪些資源(訪問頁面/頁面操作/編輯數據等)

  roles:角色,代表操作集合,可以理解為權限的集合(隱式角色)

  perms:權限(顯示角色)

三種設置權限方式:

  1 編程式: 

    Subject subject = SecurityUtils.getSubject();  
    if(subject.hasRole(“admin”)) {  
        //有權限  
    } else {  
        //無權限  
    }    

  2 注解式:

    @RequestMapping("/list")
    @ResponseBody
    @RequiresPermissions({"sys:menu:list"})
    public DataGridResult getPage(@RequestParam Map<String, Object> params) {
        Query query = new Query(params);
        return sysMenuService.getPageList(query);
    }

  3 標簽式:

            <shiro:hasPermission name="sys:user:create">
                <a href="form?add" class="btn btn-success " type="button">
                    <i class="fa fa-plus"></i>&nbsp;&nbsp;<span class="bold">新增</span>
                </a>
            </shiro:hasPermission>

兩種授權方式:

  1.1 基於角色授權:

[users]
draco = 615, role1, role3
harry = 130, role2

  1.2 基於權限授權:

[users]
draco = 615, role1, role3
harry = 130, role2
[roles]
role1 = sys:user,sys:menu
role2 = sys:user:create,sys:user:update,sys:user:list
role3 = sys:config:list

  2 編程式授權

      //分配權限        
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        
        //為用戶分配角色:
        List<String> roles = Arrays.asList("admin", "user");    
        info.addRoles(roles);
        
        //為用戶分配資源:
        List<String> perms = Arrays.asList("sys:role:list", "sys:role:info", "sys:user:save");
        info.addStringPermissions(perms);

驗證權限:

        boolean authenticated = currentUser.isAuthenticated();
        log.debug("是否登陸成功:"+ authenticated);
        
        //授權
        if(authenticated){
            
            //授權:角色
            
            //單個角色的判斷
            boolean isHasRole = currentUser.hasRole("role1");
            System.out.println(isHasRole);
            
            //多個角色判斷:逐個判斷
            boolean[] isHasRoles = currentUser.hasRoles(Arrays.asList("role1", "role2"));
            for(int i = 0; i< isHasRoles.length; i++){
                System.out.print(isHasRoles[i]+"\t");
            }
            
            //多個角色判斷:總體判斷
            System.out.println();
            boolean isHasAllRoles = currentUser.hasAllRoles(Arrays.asList("role1", "role2"));
            System.out.println(isHasAllRoles);
            
            //check方法:拋出異常
            try {
                currentUser.checkRole("role3");
            } catch (AuthorizationException e) {
                System.out.println("你沒有被分配這個角色");
                e.printStackTrace();
            }
            
            //授權:權限
            
            //單個授權的判斷
            boolean isPermitted = currentUser.isPermitted("sys:user");
            System.out.println(isPermitted);
            
            //多個權限判斷
            boolean isPermittedAll = currentUser.isPermittedAll("sys:user", "sys:menu");
            System.out.println(isPermittedAll);
            
            //check方法
            try {
                currentUser.checkPermission("sys:config:list");
            } catch (AuthorizationException e) {
                System.out.println("你沒有被分配這個權限");
                e.printStackTrace();
            }
            
        }

授權流程:

  1 調用subject.isPermitted()進行驗證,自動委托給SecurityManager

  2 SecurityManger將身份驗證委托給Authorizer

  3 Authorizer負責真正的授權者,是Shiro API中授權核心的入口點

  4 Authorizer在進行授權之前,會調用相應的Realm獲取Subject相應的角色/權限用於匹配傳入的角色/權限

  5 Authorizer會判斷Realm的角色/權限是否和傳入的匹配,如果有多個Realm,會委托給ModularRealmAuthorizer進行循環判斷,如果匹配如isPermitted*/hasRole*會返回true,否則返回false表示授權失敗

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM