基于角色的权限控制(MENU)
基于角色的权限控制是我们常见的权限控制方法,今天想了一个方法来实现根据权限显示Menu,用Menu来进行权限控制的需求还是比较常见的。
1. Menu如图
MENU | |||
Menu_A_L1 | |||
Menu_A_L21 | |||
Menu_A_L22 | |||
Menu_A_L23 | |||
Menu_B_L1 | |||
Menu_B_L21 | |||
Menu_B_L22 | |||
Menu_B_L23 | |||
Menu_C_L1 | |||
Menu_C_L21 | |||
Menu_C_L22 | |||
Menu_C_L23 | |||
Menu_D_L1 | |||
Menu_D_L21 | |||
Menu_D_L22 | |||
Menu_D_L23 | |||
2. 表结构
表结构 | |||||||
Menu | Role_Resource | User_Role | |||||
MENU_ID | PK | ROLE_ID | PK | USER_ID | PK | ||
MENU_NAME | RESOURCE_ID | PK | ROLE_ID | PK | |||
LEVEL | PRIVILEGE | ||||||
3. 模拟数据
数据示例 | ||||||||||
Menu | Role_Resource | |||||||||
MENU_ID | MENU_NAME | LEVEL | ROLE_ID | RESOURCE_ID | PRIVILEGE | |||||
Menu_A | Menu_A_L1 | 1 | ROLE1 | Menu_A | 1 | ROLE2 | Menu_C_1 | 0 | ||
Menu_A_1 | Menu_A_L21 | 2 | ROLE1 | Menu_A_1 | 1 | ROLE2 | Menu_C_2 | 0 | ||
Menu_A_2 | Menu_A_L22 | 2 | ROLE1 | Menu_A_2 | 1 | ROLE2 | Menu_C_3 | 1 | ||
Menu_A_3 | Menu_A_L23 | 2 | ROLE1 | Menu_A_3 | 1 | ROLE2 | Menu_D | 1 | ||
Menu_B | Menu_B_L1 | 1 | ROLE1 | Menu_B | 1 | ROLE2 | Menu_D_1 | 1 | ||
Menu_B_1 | Menu_B_L21 | 2 | ROLE1 | Menu_B_1 | 1 | ROLE2 | Menu_D_2 | 1 | ||
Menu_B_2 | Menu_B_L22 | 2 | ROLE1 | Menu_B_2 | 1 | ROLE2 | Menu_D_3 | 0 | ||
Menu_B_3 | Menu_B_L23 | 2 | ROLE1 | Menu_B_3 | 1 | ROLE3 | Menu_A | 1 | ||
Menu_C | Menu_C_L1 | 1 | ROLE1 | Menu_C | 1 | ROLE3 | Menu_A_1 | 0 | ||
Menu_C_1 | Menu_C_L21 | 2 | ROLE1 | Menu_C_1 | 1 | ROLE3 | Menu_A_2 | 1 | ||
Menu_C_2 | Menu_C_L22 | 2 | ROLE1 | Menu_C_2 | 1 | ROLE3 | Menu_A_3 | 1 | ||
Menu_C_3 | Menu_C_L23 | 2 | ROLE1 | Menu_C_3 | 1 | ROLE3 | Menu_B | 1 | ||
Menu_D | Menu_D_L1 | 1 | ROLE1 | Menu_D | 1 | ROLE3 | Menu_B_1 | 0 | ||
Menu_D_1 | Menu_D_L21 | 2 | ROLE1 | Menu_D_1 | 1 | ROLE3 | Menu_B_2 | 0 | ||
Menu_D_2 | Menu_D_L22 | 2 | ROLE1 | Menu_D_2 | 1 | ROLE3 | Menu_B_3 | 1 | ||
Menu_D_3 | Menu_D_L23 | 2 | ROLE1 | Menu_D_3 | 1 | ROLE3 | Menu_C | 1 | ||
ROLE2 | Menu_A | 1 | ROLE3 | Menu_C_1 | 1 | |||||
User_Role | ROLE2 | Menu_A_1 | 0 | ROLE3 | Menu_C_2 | 1 | ||||
USER_ID | ROLE_ID | ROLE2 | Menu_A_2 | 1 | ROLE3 | Menu_C_3 | 1 | |||
Yaogao | ROLE1 | ROLE2 | Menu_A_3 | 1 | ROLE3 | Menu_D | 1 | |||
USER2 | ROLE2 | ROLE2 | Menu_B | 0 | ROLE3 | Menu_D_1 | 1 | |||
USER3 | ROLE3 | ROLE2 | Menu_B_1 | 0 | ROLE3 | Menu_D_2 | 0 | |||
USER4 | ROLE2 | ROLE2 | Menu_B_2 | 0 | ROLE3 | Menu_D_3 | 0 | |||
USER4 | ROLE3 | ROLE2 | Menu_B_3 | 0 | ||||||
ROLE2 | Menu_C | 1 |
4. 实现伪代码
SQL代码
SELECT MENU.MENU_ID, MENU.MENU_NAME, MAX(MENU.PRIVILEGE)
--Min函数的情况下取最小值,当两个角色的权限冲突的时候的选择方法
FROM USER_ROLE, ROLE_RESOURCE, MENU
WHERE USER_ROLE.ROLE_ID= ROLE_RESOURCE.ROLE_ID
AND ROLE_RESOURCE.RESOURCE_ID = MENU.MENU_ID
AND USER_ID = IN_USER_ID
AND MENU.LEVEL = 1
GROUP BY MENU.MENU_ID, MENU.MENU_NAME
SELECT MENU.MENU_ID, MENU.MENU_NAME, MAX(MENU.PRIVILEGE)
--Min函数的情况下取最小值,当两个角色的权限冲突的时候的选择方法
FROM USER_ROLE, ROLE_RESOURCE, MENU
WHERE USER_ROLE.ROLE_ID= ROLE_RESOURCE.ROLE_ID
AND ROLE_RESOURCE.RESOURCE_ID = MENU.MENU_ID
AND USER_ID = IN_USER_ID
AND MENU.LEVEL = 2
GROUP BY MENU.MENU_ID, MENU.MENU_NAME
页面代码
for (int i=0, n=menuLevel1MenuList.size(); i < n, i++) {
if(menuLevel1List.get(i).get("PRIVILEGE") = 1) {
//显示Menu
}
//for循环MenuLevel2,
//根据条件比如(Menu_A_1 以 Menu_A开始, Menu_A_1的权限设置是不是1)
//显示MenuLevel1子菜单
}
这样的话,就可以实现一个用户多个角色或者单个角色,如果有不正确或者不完善的地方,麻烦发mail指教,yaogao@gmail.com 非常感谢!