权限判断-位运算
我從簡書搬家了
本文原地址:原地址
角色權限判斷,這應該是大部分應用都有的功能,那么如何進行權限判斷?
這里說下我們用的思路,可能會比較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么=。= 所以這個時候,我們可以使用位運算打成這個目的:
先說我們用來判斷的方法:
//判斷是否存在權限,permission是所有權限展示中的某個權限,只有一個&,不是兩個,別搞錯了hasPermission(permission) {return permission & GlobalValue.authValue} 復制代碼再定義一個包含了所有權限的聲明
//所有權限列表展示 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做如下操作
if (authList && authList.length > 0) {let authValue = 0for (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功能權限:
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
總結
- 上一篇: 持续交付会如何影响测试
- 下一篇: springmvc 使用fastjson