利用位運算進行權限管理
什么是位運算
主要是使用到"位運行符"操作,& 位與運算符、| 位或運行符。參與運算的如果是10進制數,則會被轉換至2進制數參與運算,然后計算結果會再轉換為10進制數輸出。
20=1,相應2進數為"0001"(這里我表示成"次方",即:2的0次方,下同)
2^1=2,相應2進數為"0010"
2^2=4,相應2進數為"0100"
2^3=8,相應2進數為"1000"
優點
位運算的運算對象是二進制的位,速度快,效率高,而且節省存儲空間,位運算做權限控制又相當地靈活。Linux系統的文件權限的實現方式,就是采用了位運算
缺點
位運算也有很大的局限,因為在32位計算機上,位移不能超過32次,這就要求權限數量不超過32種。
示例1
比如后台工具的管理權限
//定於權限 2的n次方
var ADD = 1; // 增加權限
var UPD = 2; // 修改權限
var SEL = 4; // 查找權限
var DEL = 8; // 刪除權限
// 給予某種權限用到"位或"運算符
var GROUP_A = ADD | UPD | SEL | DEL; // A 擁有增刪改查權限
var GROUP_B = ADD | UPD | SEL; // B 擁有增改查權限
var GROUP_C = ADD | UPD; // C 擁有增改權限
// 禁止某種權限用"位與"和"位非"運算符
$GROUP_D = GROUP_C & ~UPD; // D 只擁有了增權限
//檢測某個用戶是否有這個權限
console.log("A用戶組成員是否有增加權限"+ ((GROUP_A & ADD) > 0))
console.log("A用戶組成員是否有刪除權限"+ ((GROUP_A & DEL) > 0))
console.log("B用戶組成員是否有增加權限"+ ((GROUP_B & ADD) > 0))
console.log("B用戶組成員是否有刪除權限"+ ((GROUP_B & DEL) > 0))
console.log("C用戶組成員是否有增加權限"+ ((GROUP_C & ADD) > 0))
console.log("C用戶組成員是否有刪除權限"+ ((GROUP_C & DEL) > 0))
console.log("D用戶組成員是否有增加權限"+ ((GROUP_C & ADD) > 0))
console.log("D用戶組成員是否有刪除權限"+ ((GROUP_C & DEL) > 0))
示例2
在Linux文件系統中,一個用戶對文件或目錄所擁有的權限分為三種:"可讀"、"可寫"和"可執行",分別用 1 、2 和 4 來表示,它們之間可以任意組合:有"可讀"、"可寫"權限就用 3 來表示(1 + 2 = 3);有"可讀"、"可執行"權限就用5來表示(1 + 4 = 5),三種權限全部擁有就用 7 表示(1 + 2 + 4 = 7)
實際上,這種運算是基於二進制的。
假設可執行、可寫、可讀三種權限分別對應三個狀態位,如果用戶具有某種權限,那么將對應的狀態位標識為"1",反之則標識為"0"
代碼示例
//定義權限
var READ = 1<< 0; // 把可讀權限放在最右邊
var WRITE = 1<<1; // 可讀權限向左移一位
var EXCUTE = 1<<2; // 可執行權限向左移兩位
//賦予權限
var USER_TYL = READ | WRITE; //設置權限讀和寫
//驗證權限
console.log("USER_TYL可讀:"+ ((USER_TYL & READ) > 0));
console.log("USER_TYL可寫:"+ ((USER_TYL & WRITE) > 0));
console.log("USER_TYL可執行:"+ ((USER_TYL & EXCUTE) > 0));
最近喜歡用瀏覽器控制台直接跑JS代碼,將這個代碼直接貼到瀏覽器控制台,即可調試(谷歌瀏覽器快捷鍵 ctrl+shift+j)