Skip to content

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

接下来我们看看常见的权限操作指令v-hasPermi如何写

权限控制

1、常见的权限控制分类

常见的权限控制大概分为以下两种:

● 基于 ACL 的权限控制 ● 基于 RBAC 的权限控制

👉ACL

是用户 -> 权限,直接为每个用户分配权限

👉RBAC (Role-Based Access Control)模型

是用户 -> 角色 -> 权限,以角色为媒介,来为每个用户分配权限

这里我们采用的也是 RBAC 的方式,也就是通过用户角色来控制用户的权限

2、按钮权限

🔺权限机制

正常我们的权限机制是这样子的:

后台给我们返回用户权限信息permissions 前端根据返回的权限信息来判断是否有权限展示按钮 按照权限生成按钮

👉命令方式

JS
'system:user:add' 系统=> 模块 => 功能

👉使用方式

JS

// 后台给我们返回的
permissions: ["system:user:resetPwd"]; // 权限列表

// 前端按钮权限
<el-button v-hasPermi="['system:user:add']">新增</el-button>

3、按钮权限搭建

接下来我们新建一个directive文件夹,在index.js文件之中先简单实现一下我们的权限指令

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)移除元素

👉权限指令

JS
// main.js
import hasPermi from '@/directive/hasPermi'

app.directive('hasPermi',hasPermi);

👉使用

JS
<template>
  <el-button v-hasPermi="['system:user:add']">新增</el-button>
</template>

👉验证权限

接下来验证一下刚刚我们写好的权限按钮,权限和按钮匹配就显示,不匹配就隐藏

JS
const permissions = ['system:user:add'] // 显示按钮
const permissions = ['system:user:adds'] // 不显示按钮

证明我们的权限按钮没问题

👉动态权限

👉store动态权限

JS
// store/getters.js
const getters = {
  permissions: state => state.user.permissions
}
export default getters

👉使用动态权限

JS
import store from '@/store'
const permissions = store.getters && store.getters.permissions

👉 增加最高权限

当权限为*的时候,我们就可以显示所有的按钮

JS
const hasPermi = {
  mounted(el, binding) {
    const { value } = binding
    const all_permission = ['*']; // 最高权限,表示所有权限
    const permissions = ['*'];    // 用户拥有的权限列表,可以动态设置

    // 检查是否有最高权限
    const hasHighestPermission = permissions.includes('*'); // 或者你可以检查是否有 'admin' 等权限

    if (hasHighestPermission) {
      // 如果用户有最高权限,则显示所有按钮
      return;
    }

    if (value && Array.isArray(value) && value.length > 0) {
      // 如果 value 是数组且长度大于 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`]"');
    }
  }
};

export default hasPermi;

增加最高权限后,管理员下所有按钮就可以都显示了

Released under the MIT License.