權限判斷-位運算

我從簡書搬家了

本文原地址:原地址

角色權限判斷,這應該是大部分應用都有的功能,那麼如何進行權限判斷?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

相關文章
相關標籤/搜索