使用位掩码的权限设计
权限系统的设计几乎是每个系统都必需的模块。 下面就聊一聊基本设计的思路。
位掩码(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,表示拥有操作权限。