❤ 权限操作指令(v-hasPermi)

举报
林太白 发表于 2025/03/05 10:31:46 2025/03/05
49 0 1
【摘要】 权限按钮自定义指令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

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。