使用二进制设计权限

学习笔记来源: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;

相当于这四位二进制分别代表各自的基础权限

0b1111
CREATEDELETEWRITEREAD

那么上述的复杂组合就可以是:

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 1
    0 1 1 0
    ———————
    0 1 1 1

二进制且运算:两个位置都为1时就是1,否则是0。

    0 1 0 1
    0 1 1 0
    ———————
    0 1 0 0

二进制取反:1变为0,0变为1。

    0 1 0 1 --取反--> 1 0 1 0
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值