角色权限判断,这应该是大部分应用都有的功能,那么如何进行权限判断?
这里说下我们用的思路,可能会比较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 | //判断是否存在权限,permission是所有权限展示中的某个权限,只有一个&,不是两个,别搞错了 |
再定义一个包含了所有权限的声明
1 | //所有权限列表展示 |
在我们和后台请求拿到某个角色所包含的list的时候,对list做如下操作
1 | if (authList && authList.length > 0) { |
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 | 0 0 0 0 1 |
0代表false,非0代表true
所以答案是,有A权限
那么判断是否有B权限也是一样的,判断Permission.B&5
同样先转成二进制再进行&运算
1 | 0 0 0 1 0 |
所以答案是,没有B权限
相信讲到这里应该都明白了。如果不明白&的操作,可以百度一下离散数学这个&的操作。其实说简单一点就是1&1=1,0&任何=0(不保证对哈,就理解性的看下这句话,不是严格模式=。=)
所以综上:在做任何权限判断时,都可以使用这种位运算的方式来进行判断。
其他没了emmm