使用位掩码的权限设计
权限系统的设计几乎是每个系统都必需的模块。 下面就聊一聊基本设计的思路。
位掩码(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”。
后续内容会持续更新……