这几天一直想把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
原标题:基于角色的权限管理(RBAC)
关键词: