角色权限判断,这应该是大部分应用都有的功能,那么如何进行权限判断?bash
这里说下咱们用的思路,可能会比较low,各位看官别笑。 ui
打个比方,我如今有A,B,C,D四个功能。要对某个帐户是否具备这些功能权限作判断。 咱们有个list,里面存放着这个帐户全部的权限。(list从哪来?固然是后台请求回来啊!) A功能对应的权限是=>0,以此类推B=>1,C=>2,D=>3这样子。this
那么若是我有一个帐号拥有全部权限,list就是【0,1,2,3】,若是没有B权限就是【0,2,3,4】这样子,相信你们都应该明白我要表达的意思了。spa
那么要判断是否拥有某个权限,这时候确定就会说,遍历一下list不就知道了?那若是权限比较多呢?并且你不以为这样更low么=。= 因此这个时候,咱们可使用位运算打成这个目的:code
先说咱们用来判断的方法:cdn
//判断是否存在权限,permission是全部权限展现中的某个权限,只有一个&,不是两个,别搞错了
hasPermission(permission) {
return permission & GlobalValue.authValue
}
复制代码
再定义一个包含了全部权限的声明blog
//全部权限列表展现
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作以下操做get
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.若是看懂了就不用往下看了,不浪费大牛的时间~~数学
可能各位没看懂老哥会很迷我在干吗,这一步操做是干什么?别慌,让咱们往下看it
咱们举一个例子来解释这个问题。假设我当前帐号只有AC两个功能,那么我拿到的authList是多少呢?很简单:【0,2】
那么根据上面for循环的一顿操做,我这个返回的authValue会是多少呢?
2的0次方+2的2次方=5,这个数学就很少说了。。 那么如今咱们能够知道,authValue = 5, 那么假设我如今要判断当前帐户是否存在A功能权限:
let isHave = this. hasPermission(Permission.A)
复制代码
那么接下来重点来了,这就须要一丢丢离散数学的知识了 其实就是对Permission.A&5这一步进行计算 先转成二进制再进行&运算
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
一样先转成二进制再进行&运算
0 0 0 1 0
& 0 0 1 0 1
————————————————————————————————
0 0 0 0 0
结果是:0
复制代码
因此答案是,没有B权限
相信讲到这里应该都明白了。若是不明白&的操做,能够百度一下离散数学这个&的操做。其实说简单一点就是1&1=1,0&任何=0(不保证对哈,就理解性的看下这句话,不是严格模式=。=) 因此综上:在作任何权限判断时,均可以使用这种位运算的方式来进行判断。
其余没了emmm