基于角色的权限控制(MENU)

 

基于角色的权限控制(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.  表结构  

表结构
MenuRole_ResourceUser_Role
      
MENU_IDPKROLE_IDPKUSER_IDPK
MENU_NAME RESOURCE_IDPKROLE_IDPK
LEVEL PRIVILEGE   
      
      

3.  模拟数据

数据示例
MenuRole_Resource
MENU_IDMENU_NAMELEVELROLE_IDRESOURCE_IDPRIVILEGE
Menu_AMenu_A_L11ROLE1Menu_A1ROLE2Menu_C_10
Menu_A_1Menu_A_L212ROLE1Menu_A_11ROLE2Menu_C_20
Menu_A_2Menu_A_L222ROLE1Menu_A_21ROLE2Menu_C_31
Menu_A_3Menu_A_L232ROLE1Menu_A_31ROLE2Menu_D1
Menu_BMenu_B_L11ROLE1Menu_B1ROLE2Menu_D_11
Menu_B_1Menu_B_L212ROLE1Menu_B_11ROLE2Menu_D_21
Menu_B_2Menu_B_L222ROLE1Menu_B_21ROLE2Menu_D_30
Menu_B_3Menu_B_L232ROLE1Menu_B_31ROLE3Menu_A1
Menu_CMenu_C_L11ROLE1Menu_C1ROLE3Menu_A_10
Menu_C_1Menu_C_L212ROLE1Menu_C_11ROLE3Menu_A_21
Menu_C_2Menu_C_L222ROLE1Menu_C_21ROLE3Menu_A_31
Menu_C_3Menu_C_L232ROLE1Menu_C_31ROLE3Menu_B1
Menu_DMenu_D_L11ROLE1Menu_D1ROLE3Menu_B_10
Menu_D_1Menu_D_L212ROLE1Menu_D_11ROLE3Menu_B_20
Menu_D_2Menu_D_L222ROLE1Menu_D_21ROLE3Menu_B_31
Menu_D_3Menu_D_L232ROLE1Menu_D_31ROLE3Menu_C1
ROLE2Menu_A1ROLE3Menu_C_11
User_RoleROLE2Menu_A_10ROLE3Menu_C_21
USER_IDROLE_IDROLE2Menu_A_21ROLE3Menu_C_31
YaogaoROLE1ROLE2Menu_A_31ROLE3Menu_D1
USER2ROLE2ROLE2Menu_B0ROLE3Menu_D_11
USER3ROLE3ROLE2Menu_B_10ROLE3Menu_D_20
USER4ROLE2ROLE2Menu_B_20ROLE3Menu_D_30
USER4ROLE3ROLE2Menu_B_30
ROLE2Menu_C1    

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 非常感谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值