权限判断-位运算

我从简书搬家了

本文原地址:原地址

角色权限判断,这应该是大部分应用都有的功能,那么如何进行权限判断?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

相关文章
相关标签/搜索