基于角色的权限管理(RBAC)

 这几天一直想把web项目中菜单的管理梳理一遍,今天终于写了个小Demo。在这个过程中融合了linux权限管理的思想。具体的阐述记录在代码中,我相信这个注释将会非常详细。

 

项目结构如下图: 基于角色的权限管理(RBAC)

 

 

 

 

 

 

 

 

Main.java中是菜单权限控制的核心

package com.albert.test;  
  
import java.util.ArrayList;  
import java.util.HashSet;  
import java.util.List;  
import java.util.Set;  
  
import com.albert.model.Menu;  
import com.albert.model.Person;  
import com.albert.model.Role;  
import com.albert.service.BaseService;  
  
/** 
 * @{#} Main.java Created on 2015-11-19 上午11:57:18 
 * 主测试方法 
 */  
  
public class Main {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
          
       BaseService service = new BaseService();  
       List<Role> roles = service.initRole();  
       List<Menu> menus = service.initMenu();  
         
       /** 
        * 模拟当前登录用户,目前写死为张三,ID是1 
        */  
       Person curPerson = service.initPerson().get(0);  
       /** 
        * 当前登录用户的角色 
        */  
       Role curRole  = null;  
       for(Role r : roles){  
           if(curPerson.getRoleId()==r.getId()){  
               curRole = r;  
               break;  
           }  
       }  
         
       System.out.println("当前用户:"+ curPerson.getName());  
       System.out.println("当前角色:"+ curRole.getName());  
         
       /** 
        * 当前用户的menu 
        */  
       List<Menu> curMenus = new ArrayList<Menu>();  
       /** 
        * 当前用户menu的父menu 
        */  
       Set<Menu> parentMenus = new HashSet<Menu>();  
       /** 
        * 这个for语句块是这个demo的核心加重点。 
        * t_menu表中所有子菜单都有一个不重复的sn,比如《用户新增》的sn是0, 
        * 《用户修改》的sn是1; 
        *  
        * 某个角色(t_role)对以上两个菜单有权限,那么acl = 2^0+2^1, 
        * 也就是3。看到这里是不是一头雾水? 
        *  
        * 验证这个角色是否有《用户修改》权限,只需要 &运算符,即 2^1 & 3, 
        * 结果是2,非0即说明拥有该权限。 
        *  
        *   这个原理如下: 
        *   3 二进制   0000 0011 
        *   2 二进制   0000 0010 
        *   &运算后    0000 0010 非0,则有这个权限 
        */  
       for(Menu m : menus){  
           Double sn = Math.pow(2d, m.getSn());  
           if((sn.intValue() & curRole.getAcl())!=0){  
               curMenus.add(m);  
               for(Menu n : menus){  
                   if(m.getPid() == n.getId()){  
                       parentMenus.add(n);  
                   }  
               }  
           }  
       }  
         
       //显示菜单(打印到控制台)  
       for(Menu m : parentMenus){  
           System.out.println("》"+m.getName());  
           for(Menu n : curMenus){  
               if(n.getPid() == m.getId()){  
                   System.out.println("  |"+n.getName());  
               }  
           }  
       }  
        
    }  
  
}

  运行main方法打印控制台输出如下 基于角色的权限管理(RBAC)

 

 

 

 

 

 

获取【下载地址】 java企业级框架 SpringMVC_mybatis or hibernate+ ehcache +shiro+druid+bootstrap+HTML5

你可能感兴趣的:(rbac)