最近在做管理后台,遇到这样的需求,假设:
-
a 权限值为 1
-
b 权限值为 2
-
c 权限值为 4
-
d 权限值为 8
-
e 权限值为 16
-
...
注:每种权限值都是 2 的平方
后端会返回 A 用户的 N 个权限值总和,举个例子:
- 假设 A 用户拥有 c 和 d 这两项权限
- 那么 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 类型所能够承载的最大数值。