你的位置:首页 > ASP.net教程

[ASP.net教程]基于角色的权限管理(RBAC)


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

 

项目结构如下图:

 

 

 

 

 

 

 

 

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

1.package com.albert.test; 2. 3.import java.util.ArrayList; 4.import java.util.HashSet; 5.import java.util.List; 6.import java.util.Set; 7. 8.import com.albert.model.Menu; 9.import com.albert.model.Person; 10.import com.albert.model.Role; 11.import com.albert.service.BaseService; 12. 13./** 14. * @{#} Main.java Created on 2015-11-19 上午11:57:18 15. * 主测试方法 16. */ 17. 18.public class Main { 19. 20.  /** 21.   * @param args 22.   */ 23.  public static void main(String[] args) { 24.     25.    BaseService service = new BaseService(); 26.    List<Role> roles = service.initRole(); 27.    List<Menu> menus = service.initMenu(); 28.     29.    /** 30.    * 模拟当前登录用户,目前写死为张三,ID是1 31.    */ 32.    Person curPerson = service.initPerson().get(0); 33.    /** 34.    * 当前登录用户的角色 35.    */ 36.    Role curRole = null; 37.    for(Role r : roles){ 38.      if(curPerson.getRoleId()==r.getId()){ 39.        curRole = r; 40.        break; 41.      } 42.    } 43.     44.    System.out.println("当前用户:"+ curPerson.getName()); 45.    System.out.println("当前角色:"+ curRole.getName()); 46.     47.    /** 48.    * 当前用户的menu 49.    */ 50.    List<Menu> curMenus = new ArrayList<Menu>(); 51.    /** 52.    * 当前用户menu的父menu 53.    */ 54.    Set<Menu> parentMenus = new HashSet<Menu>(); 55.    /** 56.    * 这个for语句块是这个demo的核心加重点。 57.    * t_menu表中所有子菜单都有一个不重复的sn,比如《用户新增》的sn是0, 58.    * 《用户修改》的sn是1; 59.    * 60.    * 某个角色(t_role)对以上两个菜单有权限,那么acl = 2^0+2^1, 61.    * 也就是3。看到这里是不是一头雾水? 62.    * 63.    * 验证这个角色是否有《用户修改》权限,只需要 &运算符,即 2^1 & 3, 64.    * 结果是2,非0即说明拥有该权限。 65.    * 66.    *  这个原理如下: 67.    *  3 二进制  0000 0011 68.    *  2 二进制  0000 0010 69.    *  &运算后  0000 0010 非0,则有这个权限 70.    */ 71.    for(Menu m : menus){ 72.      Double sn = Math.pow(2d, m.getSn()); 73.      if((sn.intValue() & curRole.getAcl())!=0){ 74.        curMenus.add(m); 75.        for(Menu n : menus){ 76.          if(m.getPid() == n.getId()){ 77.            parentMenus.add(n); 78.          } 79.        } 80.      } 81.    } 82.     83.    //显示菜单(打印到控制台) 84.    for(Menu m : parentMenus){ 85.      System.out.println("》"+m.getName()); 86.      for(Menu n : curMenus){ 87.        if(n.getPid() == m.getId()){ 88.          System.out.println(" |"+n.getName()); 89.        } 90.      } 91.    } 92.    93.  } 94. 95.} 

  运行main方法打印控制台输出如下

 

 

 

 

 

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