今天要談的不是前端鑒權(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)限的方案