使用位掩碼的權限設計
權限系統的設計幾乎是每個系統都必需的模塊。 下面就聊一聊基本設計的思路。
位掩碼(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,表示擁有操作權限。