我的GitHub
0%

权限判断-位运算

角色权限判断,这应该是大部分应用都有的功能,那么如何进行权限判断?

这里说下我们用的思路,可能会比较low,各位看官别笑。

打个比方,我现在有A,B,C,D四个功能。要对某个账户是否具有这些功能权限做判断。
我们有个list,里面存放着这个账户所有的权限。(list从哪来?当然是后台请求回来啊!)
A功能对应的权限是=>0,以此类推B=>1,C=>2,D=>3这样子。

那么如果我有一个账号拥有所有权限,list就是【0,1,2,3】,如果没有B权限就是【0,2,3,4】这样子,相信大家都应该明白我要表达的意思了。

那么要判断是否拥有某个权限,这时候肯定就会说,遍历一下list不就知道了?那如果权限比较多呢?而且你不觉得这样更low么=。=
所以这个时候,我们可以使用位运算打成这个目的:

先说我们用来判断的方法:

1
2
3
4
//判断是否存在权限,permission是所有权限展示中的某个权限,只有一个&,不是两个,别搞错了
hasPermission(permission) {
return permission & GlobalValue.authValue
}

再定义一个包含了所有权限的声明

1
2
3
4
5
6
7
8
//所有权限列表展示
export let Permission = {
A: Math.pow(2, 0), //A功能
B: Math.pow(2, 1), //B功能
C: Math.pow(2, 2), //C功能
D: Math.pow(2, 3), //D功能
...
}

在我们和后台请求拿到某个角色所包含的list的时候,对list做如下操作

1
2
3
4
5
6
7
8
9
if (authList && authList.length > 0) {
let authValue = 0
for (let i = 0; i < authList.length; i++) {
let index = authList[i]
let permission = Math.pow(2, index)
authValue += permission
}
return authValue//我在代码里GlobalValue.authValue = authValue存起来了,你们也找个全局的东西存起来就好
}

P.S.如果看懂了就不用往下看了,不浪费大牛的时间~~

可能各位没看懂老哥会很迷我在干嘛,这一步操作是干什么?别慌,让我们往下看

我们举一个例子来解释这个问题。假设我当前账号只有AC两个功能,那么我拿到的authList是多少呢?很简单:【0,2】

那么根据上面for循环的一顿操作,我这个返回的authValue会是多少呢?

2的0次方+2的2次方=5,这个数学就不多说了。。
那么现在我们可以知道,authValue = 5,
那么假设我现在要判断当前账户是否存在A功能权限:

1
let isHave =  this. hasPermission(Permission.A)

那么接下来重点来了,这就需要一丢丢离散数学的知识了
其实就是对Permission.A&5这一步进行计算
先转成二进制再进行&运算

1
2
3
4
5
6
            0 0 0 0 1
& 0 0 1 0 1
————————————————————————————————
0 0 0 0 1

结果是:2的0次方=1

0代表false,非0代表true
所以答案是,有A权限

那么判断是否有B权限也是一样的,判断Permission.B&5

同样先转成二进制再进行&运算

1
2
3
4
5
6
            0 0 0 1 0
& 0 0 1 0 1
————————————————————————————————
0 0 0 0 0

结果是:0

所以答案是,没有B权限

相信讲到这里应该都明白了。如果不明白&的操作,可以百度一下离散数学这个&的操作。其实说简单一点就是1&1=1,0&任何=0(不保证对哈,就理解性的看下这句话,不是严格模式=。=)
所以综上:在做任何权限判断时,都可以使用这种位运算的方式来进行判断。

其他没了emmm

我是阿星,阿星的阿,阿星的星!