使用位掩码的权限设计
权限系统的设计几乎是每个系统都必需的模块。 下面就聊一聊基本设计的思路。
位掩码(BitMask),是位(Bit)和掩码(Mask)的组合词。
“位”指代着二进制数据当中的二进制位,而”掩码“指的是用于进行按位操作的二进制数字。
位掩码权限(Bitmask Permissions)是一种权限管理系统设计思路,用于在程序使用中进行控制和限制。 它使用一系列二进制位来表示不同的权限或访问级别。
每个二进制位都代表一种权限或操作,可以设置1或者0为开启或关闭。
比如有下列权限7位二进制序列 表示一种权限系列。
11111111。
有此权限,在对应二进制位置设置为1,无此权限,对应二进制位值设置为0;
权限种类设计(字典数据)
二进制位 权限描述(位置序号) 0 : 权限01 : 权限12 : 权限23 : 权限34 : 权限45 : 权限56 : 权限67 : 权限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 ... : ... : ...... : ... : ...... : ... : ...
如何设置某个用户权限数值(十进制数值)?
为某个用户的设置多种权限:将每个权限的十进制数值相加。
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
如何查询某个用户有哪些权限?
将用户权限数值,与每个权限字典数据进行“按位与”计算。
如果“按位与”后的数值与权限种类字典数据相等,就说明包含此权限。
假如某用户的权限十进制数值为: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_index1| 权限1| 2| 6| 2| 12| 权限2| 4| 6| 4| 2
如何判断某个用户是否有操作程序某些功能模块的权限?
假设功能模块需要(2,'权限2'), (3,'权限3'),才能操作。
而某用户的权限十进制数值为:roleValue=6。
判断是否有此模块的操作权限方法为:
计算功能模块的权限十进制数值: 1<<2+1<<3=12
用户权限的十进制数值 & 功能模块的十进制数值 > 0,表示拥有操作权限。