利用自定義指令進(jìn)行前端權(quán)限控制

今天要談的不是前端鑒權(quán)這個比較大的話題,而是談前端權(quán)限的控制。
在項目中遇到一個問題是管理員才有新建專輯按鈕,普通用戶沒有。
那么如何展示呢?
在前端領(lǐng)域,一般會有兩種權(quán)限控制方法,一種是根據(jù)路由權(quán)限控制,另一種是結(jié)構(gòu)的顯示隱藏?,F(xiàn)在遇到的這個問題,顯然用第二種方法控制最簡單。
因此,就在頁面中寫一個方法。判斷是否有權(quán)限,然后在按鈕上v-if一個data屬性。
但是這種方案有一個弊端,就是每個頁面都需要寫這樣的方法和屬性(當(dāng)然可以用mixin來實現(xiàn))
因此,更簡便的方案是什么呢?自定義指令
開發(fā)一個自定義指令
首先添加判斷是否有權(quán)限的方法:

import Vue from 'vue'
import store from '@/store'
// 是否有權(quán)限
const hasPermission = (userPermission, permissionsList = []) => {
  let userPermissionList = Array.isArray(userPermission) ? userPermission : [userPermission];
  return userPermissionList.some(e => permissionsList.includes(e));
};

定義一個指令:

Vue.directive('permission', {
  bind: (el, binding, vnode) => {
    store.dispatch('clad/db/get', {
      dbName: 'sys',
      path: 'user.info',
      defaultValue: {},
      user: true
    }, {root: true}).then(res => {
      if (Object.prototype.toString.call(binding.value) === '[object Array]') {
        if (!hasPermission(res.data_range, binding.value)) {
          el.parentNode.removeChild(el);
        }
      } else {
        if (!hasPermission(binding.value, res.permissions)) {
          el.parentNode.removeChild(el);
        }
      }
    });
  }
})

可以看到,當(dāng)用戶權(quán)限列表不包含傳入的字符串時,就將這個元素刪除掉。

在項目最外層的main.js中引入這個指令。那么在我們需要用到這個權(quán)限指令的時候就可以這樣使用:

<el-button @click="handleAddAlbum" v-permission="'管理素材專輯'" size="medium" type="primary">
    <i class="btn_add_icon"></i>新增專輯
</el-button>

至此,這就是利用自定義指令控制前端權(quán)限的方案

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容