Skip to content

Latest commit

 

History

History
86 lines (48 loc) · 1.56 KB

按位与(&)操作符获取权限.md

File metadata and controls

86 lines (48 loc) · 1.56 KB

按位与(&)操作符获取权限

最近在做管理后台,遇到这样的需求,假设:

  1. a 权限值为 1

  2. b 权限值为 2

  3. c 权限值为 4

  4. d 权限值为 8

  5. e 权限值为 16

  6. ...

    注:每种权限值都是 2 的平方


后端会返回 A 用户的 N 个权限值总和,举个例子:

  1. 假设 A 用户拥有 c 和 d 这两项权限
  2. 那么 A 用户的权限值总和为 c + d 即 (4 + 8),也就是 12

那么现在问题是:如何根据权限值总和来得到用户究竟拥有哪些权限?

答:使用 按位与 运算符,也就是 & 这个运算符,当其运算结果不为 0 时即表示拥有该权限


例如:

12&1 //0
12&2 //0
12&4 //4
12&8 //8
12&16 //0

那么具体的代码,我们可以写成:

const aPowerValue = 1
const bPowerValue = 2
const cPowerValue = 4
const dPowerValue = 8
const ePowerValue = 16

...

const totalPower = 12

const userPowers = {
    a: (12 & aPowerValue) !== 0,
    b: (12 & bPowerValue) !== 0,
    c: (12 & cPowerValue) !== 0,
    d: (12 & dPowerValue) !== 0,
    e: (12 & ePowerValue) !== 0
}

想知道当前用户是否拥有 a 的权限,那么直接获取 userPower.a 的值即可知道。


这种权限规则的弊端:

这种规则在设计的时候,每一个权限的值都是 2 的平方。当权限数量不太多的情况下,这个问题不会太明显。

但是,假设权限比较多,那么最终某个权限的值会非常大,甚至超出 int 类型所能够承载的最大数值。