学习笔记来源:https://www.bilibili.com/video/BV19h4y1A7Gq/?spm_id_from=333.337.search-card.all.click&vd_source=a0f31140205458776d3a4ef477cd6561
假如已知四个权限:
const READ = 1;
const WRITE = 2;
const DELETE = 3;
const CREATE = 4;
而表示复杂权限组合时我们可能:
const READ_AND_WRITE = 5;
const READ_AND_DELETE = 6;
const ADMIN = 7;
const CREATE_AND_WRITE_AND_DELETE = 8;
...
当有更多复杂的权限组合时可能会有需要定义更多的数字。
而如果我们采用二进制去设计:
const READ = 0b0001;
const WRITE = 0b0010;
const DELETE = 0b0100;
const CREATE = 0b1000;
相当于这四位二进制分别代表各自的基础权限
0b | 1 | 1 | 1 | 1 |
---|---|---|---|---|
CREATE | DELETE | WRITE | READ |
那么上述的复杂组合就可以是:
const READ_AND_WRITE = 0b0011;
const READ_AND_DELETE = 0b0101;
const ADMIN = 0b1111;
const CREATE_AND_WRITE_AND_DELETE = 0b1110;
...
而且 如果采用或运算 可读性将大大提升:
const READ_AND_WRITE = READ | WRITE;
const READ_AND_DELETE = READ | DELETE;
const ADMIN = READ | WRITE | DELETE | CREATE;
const CREATE_AND_WRITE_AND_DELETE = WRITE | DELETE | CREATE;
...
判断某权限是否包含可读权限,可以采用二进制且运算:
const perm = 0b1010;console.log(perm & READ === READ); // true
console.log(perm & WRITE === WRITE); // false
结果为真时,该权限包含指定权限。
对某用户取消一个权限,例如取消下列可读权限:
const perm = READ | DELETE | CREATE; // 0111
const newPerm = perm & (~READ)
console.log(newPerm.toString(2)); // 110
结果为真时,该权限包含指定权限。
位运算知识点补充
二进制或运算:两个位置有一个为1就是1,否则是0。
0 1 0 10 1 1 0———————0 1 1 1
二进制且运算:两个位置都为1时就是1,否则是0。
0 1 0 10 1 1 0———————0 1 0 0
二进制取反:1变为0,0变为1。
0 1 0 1 --取反--> 1 0 1 0