❤ 权限操作指令(v-hasPermi)
【摘要】 权限按钮自定义指令v-hasPermi
❤ 权限操作指令(v-hasPermi)
接下来我们看看常见的权限操作指令v-hasPermi如何写
权限控制
1、常见的权限控制分类
常见的权限控制大概分为以下两种:
● 基于 ACL 的权限控制 ● 基于 RBAC 的权限控制
👉ACL
是用户 -> 权限,直接为每个用户分配权限
👉RBAC (Role-Based Access Control)模型
是用户 -> 角色 -> 权限,以角色为媒介,来为每个用户分配权限
这里我们采用的也是 RBAC 的方式,也就是通过用户角色来控制用户的权限
2、按钮权限
🔺权限机制
正常我们的权限机制是这样子的:
后台给我们返回用户权限信息permissions 前端根据返回的权限信息来判断是否有权限展示按钮 按照权限生成按钮
👉命令方式
'system:user:add' 系统=> 模块 => 功能
👉使用方式
// 后台给我们返回的
permissions: ["system:user:resetPwd"]; // 权限列表
// 前端按钮权限
<el-button v-hasPermi="['system:user:add']">新增</el-button>
3、按钮权限搭建
接下来我们新建一个directive文件夹,在index.js文件之中先简单实现一下我们的权限指令
// directives/index.js
export default {
mounted(el, binding) {
const { value } = binding
const all_permission = ['*']
const permissions = ['system:user:add'] //权限列表
// 如果 value 是数组且长度大于 0
if (value && Array.isArray(value) && value.length > 0) {
const permissionFlag = value
// 检查用户是否具有指定的权限
const hasPermission = all_permission.some(permission => permissionFlag.includes(permission)) ||
permissions.some(permission => permissionFlag.includes(permission))
// 如果没有权限,移除元素
if (!hasPermission) {
el.parentNode && el.parentNode.removeChild(el)
}
} else {
throw new Error('need roles! Like v-hasPermi="[`system:user:add`]"')
}
}
}
- 这里我们简单看一下上面代码在这个过程之中做了哪些事情:
- 从元素挂载开始,在mounted生命周期钩子中(el:被绑定的 DOM 元素,binding:包含指令相关信息的对象,后面我们拿的value值,也就是['system:user:add']这个值)
- 判断['system:user:add']是否为我们想要的有效数组
- 判断用户是否具有指定的权限
- 没有权限的时候=>el.parentNode拿到父元素节点=>el.parentNode.removeChild(el)移除元素
👉权限指令
// main.js
import hasPermi from '@/directive/hasPermi'
app.directive('hasPermi',hasPermi);
👉使用
<template>
<el-button v-hasPermi="['system:user:add']">新增</el-button>
</template>
👉验证权限
接下来验证一下刚刚我们写好的权限按钮,权限和按钮匹配就显示,不匹配就隐藏
const permissions = ['system:user:add'] // 显示按钮
const permissions = ['system:user:adds'] // 不显示按钮
证明我们的权限按钮没问题
👉动态权限
👉store动态权限
// store/getters.js
const getters = {
permissions: state => state.user.permissions
}
export default getters
👉使用动态权限
import store from '@/store'
const permissions = store.getters && store.getters.permissions
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)