权限设计方案--位掩码的权限设计

使用位掩码的权限设计

权限系统的设计几乎是每个系统都必需的模块。 下面就聊一聊基本设计的思路。

位掩码(BitMask),是位(Bit)和掩码(Mask)的组合词。

“位”指代着二进制数据当中的二进制位,而”掩码“指的是用于进行按位操作的二进制数字。

位掩码权限(Bitmask Permissions)是一种权限管理系统设计思路,用于在程序使用中进行控制和限制。 它使用一系列二进制位来表示不同的权限或访问级别。

每个二进制位都代表一种权限或操作,可以设置1或者0为开启或关闭。

比如有下列权限7位二进制序列 表示一种权限系列。

11111111。

有此权限,在对应二进制位置设置为1,无此权限,对应二进制位值设置为0;

权限种类设计(字典数据)

 二进制位  	权限描述
 (位置序号) 
 0	:	权限0
 1	:	权限1
 2	:	权限2
 3	:	权限3
 4	:	权限4
 5	:	权限5
 6	:	权限6
 7	:	权限7

权限种类字典数据,对应的二进制数据计算方式:(使用位移运算符)

权限0	:	1<<0	:	等于十进制 1
权限1	:	1<<1	:	等于十进制 2
权限2	:	1<<2	:	等于十进制 4	
权限3	:	1<<3	:	等于十进制 8	
权限4	:	1<<4	:	等于十进制 16	
权限5	:	1<<5	:	等于十进制 32	
权限6	:	1<<6	:	等于十进制 64	
权限7	:	1<<7	:	等于十进制 128	
 ...	:	...	:	...
 ...	:	...	:	...
 ...	:	...	:	...
 
 

问题01.如何设置某个用户权限数值(十进制数值)?

为某个用户的设置多种权限:将每个权限的十进制数值相加。

SELECT  
        SUM(POWER(2, role_code.indx)) AS my_role_value
FROM (
	VALUES
	(1,'权限1'),
	(2,'权限2')
)AS role_code(indx,name)

查询结果为(十进制数值)

   my_role_value 
                6

即此用户的权限数值为6。

问题02. 如何查询某个用户有哪些权限?

将用户权限数值,与每个权限字典数据进行“按位与”计算。

如果“按位与”后的数值与权限种类字典数据相等,就说明包含此权限。

假如某用户的权限十进制数值为:roleValue=6

使用SQL求解用户包含的权限列表

   SELECT  
       role_code.indx AS role_index,
	  role_code.name AS role_name,
	  POWER(2, role_code.indx) AS role_value,
	  tmp.my_role_value,
	  /*“按位与”*/
	  tmp.my_role_value & POWER(2, role_code.indx)AS include_role_value,
	  role_code.indx  AS include_role_index
FROM (
       VALUES
                (0,'权限0'),
                (1,'权限1'),
                (2,'权限2'),
                (3,'权限3'),
                (4,'权限4'),
                (5,'权限5'),
                (6,'权限6'),
                (7,'权限7')
) AS role_code(indx,name)
/*某用户的权限十进制数值*/
,(select 6 AS my_role_value) AS tmp
/*“按位与”等于权限的十进制数值的*/
WHERE (tmp.my_role_value & POWER(2, role_code.indx)) =  POWER(2, role_code.indx)

    
   

查询结果为

role_index|	role_name|	role_value|	my_role_value|	include_role_value|	include_role_index
	1|		权限1|		2|		6|			2|			1
	2|		权限2|		4|		6|			4|			2	
            

即此用户权限数值=6,对应的权限为“权限1 权限2”。

问题03. 如何判断某个用户是否有操作程序某些功能模块的权限?

假设某个功能模块的权限包设有(1,'权限1'),(2,'权限2'),(3,'权限3')的操作,对应的十进制数值为:roleValue= (POWER(2, 1)+POWER(2, 2)+POWER(2, 3)) = 14。即此功能模块的权限数值为14。

而某用户的权限分配包含(2,'权限2'),(3,'权限3'),对应的十进制数值为:roleValue=(POWER(2, 2)+POWER(2, 3)=12。即此用户的权限数值为12。

*** 判断是否有此模块的某种操作权限方法为:

用户权限的十进制数值 & 功能模块的十进制数值 > 0, 即表示用户拥有此模块的一些操作权限。

问题04. 如何求解,此用户拥有操作此功能模块的具体哪些权限?

使用SQL求解用户可操作此模块的权限列表

   SELECT  
       role_code.indx AS role_index,
	  role_code.name AS role_name,
	  POWER(2, role_code.indx) AS role_value,
	  tmp.my_role_value,
	  /*“按位与”*/
	  tmp.my_role_value & POWER(2, role_code.indx)AS include_role_value,
	  role_code.indx  AS include_role_index
FROM (
       VALUES
                (0,'权限0'),
                (1,'权限1'),
                (2,'权限2'),
                (3,'权限3'),
                (4,'权限4'),
                (5,'权限5'),
                (6,'权限6'),
                (7,'权限7')
) AS role_code(indx,name)
/*某用户的权限十进制数值 “按位与” 功能模块的权限十进制数值*/
,(select (POWER(2, 1)+POWER(2, 2)+POWER(2, 3)) & (POWER(2, 2)+POWER(2, 3)) AS my_role_value) AS tmp
/*“按位与”等于权限的十进制数值的*/
WHERE (tmp.my_role_value & POWER(2, role_code.indx)) =  POWER(2, role_code.indx)
   

查询结果为

role_index|	role_name|	role_value|	my_role_value|	include_role_value|	include_role_index
	2|		权限2|		4|		12|			4|		2
	3|		权限3|		8|		12|			8|		8	

即,此用户拥有操作此模块的权限为“权限2,权限3”。

后续内容会持续更新……

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值