权限管理之admin数据不可编辑

news2024/11/22 18:31:33

效果图

在线地址:https://codesandbox.io/s/authorizedbyrole-yzy4r2?file=/src/util/directive.js

当前用户为非管理员角色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AstPxFPY-1691845473313)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e442293a-50a2-4493-8ea5-b5be8bceb566/Untitled.png)]

环境

vuetify@2.6.6 vuex javascript

事情经过

一般的系统,都是采用**RBAC模型:基于用户-角色-权限控制**

所以在菜单管理中给角色授权,就可以实现对应的操作

但是最近,我接到了一个需求,管理员角色创建的数据,非管理员无论前端授权情况,都不可操作

于是,我的想法是在v-has控制授权按钮指令里面做操作

但是,我发现,无法拿到当条数据

于是,开始了投机取巧之类的想法

创建了一个admin列,管理员角色创建的数据用图标mdi-alpha-a-circle 显示

判断当前行有没有mdi-alpha-a-circle class类,来判断是不是管理员创建的数据

然后判断当前角色是不是非管理员,若是,删除节点

流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qfLrmrX-1691845473314)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2fba390b-e87f-4d4b-946e-f4ec05507807/Untitled.png)]

必要条件

  1. 有个admin列,管理员角色创建的数据用图标mdi-alpha-a-circle 显示
  2. 必须按照 tr >td>template>btn DOM结构,如下
<template v-slot:item.actions="{ item }">
  <v-btn v-has:edit icon @click.stop="edit(item)">
    <v-icon size="1.25rem"> mdi-pencil </v-icon>
  </v-btn>
  <v-btn v-has:del icon>
    <v-icon size="1.25rem" class="icon-hover-bg ml-2" @click.stop="del(item)"> mdi-delete </v-icon>
  </v-btn>
</template>

实现思路

创建admin列

一般来说,接口是不可能把创建者所属角色返回的,一般返回的是userIduserName,所以必须根据角色查询所有userId,存储在store中,如userIdByAdminList ,判断当前用户是否是admin角色

实现思路:

<template v-slot:item.createUser="{ item }">
  <v-icon
    v-if="$store.state.userIdByAdminList.includes(item.createUser)"
    size="1.5rem"
    color="primary"
    >mdi-alpha-a-circle</v-icon
  >
  <span v-else>{{ item.createUser }}</span>
</template>

给按钮添加v-has

<template v-slot:item.actions="{ item }">
  <v-btn v-has:edit icon @click.stop="edit(item)">
    <v-icon size="1.25rem"> mdi-pencil </v-icon>
  </v-btn>
  <v-btn v-has:del icon>
    <v-icon size="1.25rem" class="icon-hover-bg ml-2" @click.stop="del(item)"> mdi-delete </v-icon>
  </v-btn>
</template>

v-has实现

递归寻找adminIcon

结束递归的条件:满足之一即可

  • item.childNodes.length===0
  • iconNode不为null
let iconNode = null
const getAdminIcon = (nodeList) => {
  //  console.log('nodeList', nodeList)
  if(iconNode){
    return iconNode
  }
   
   for (let i = 0; i < nodeList.length; i++) {
      let item = nodeList[i]
      let bool = item.classList && item.classList.contains('mdi-alpha-a-circle')
      // console.log('item', item)
      // console.log('bool', bool)
      if (bool) {
         iconNode = item
         break
      }
      if (item.childNodes.length === 0) {
         continue
      }
      iconNode = getAdminIcon(item.childNodes)
   }
   return iconNode
}

v-has指令实现

// v-has:search
const has = {
   inserted(el, binding, vnode) {
      let isForceDel = false
      // 第一种实现方式
      let trNodes = el.parentNode.parentNode.childNodes
      if (trNodes) {
         const iconEle = getAdminIcon(trNodes)
         if (iconEle) {
            console.log(iconEle) // 管理员创建的数据
            let roleId = store.state.userInfo.roleId
            isForceDel = roleId !== 'admin'
         }
      }

      const value = binding.arg || binding.value || binding.value.arg

      const permissions = vnode.context.$route.meta.buttons || []
      
      if (value) {
         if (!permissions.includes(value) || isForceDel) {
          
            ;(el.parentNode && el.parentNode.removeChild(el)) ||
               (el.style.display = 'none')
         }
      }
   }
}

第二种实现思路

传入当前记录函数:v-has:del = "item"

主要逻辑代码:

if (binding.value) {
  let record = binding.value;
  let isAdmin = store.state.userIdByAdminList.includes(record.createUser);
  let userId = store.state.userInfo.userId;

  if (isAdmin) {
    isForceDel = !store.state.userIdByAdminList.includes(userId);
  }
}

这样子做的一个不好的点就是,每个按钮都要传参,并且必须有createUser字段,适合所有页面还没有授权的情况

踩坑记录

https://segmentfault.com/q/1010000044084082?_ea=312694630

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端接口修改工具 Requestly具体操作

更新于2023年8月12日18:17:56&#xff0c;插件版本可能会变&#xff0c;界面可能会有所变化 插件下载地址&#xff1a;https://chrome.google.com/webstore/detail/requestly-open-source-htt/mdnleldcmiljblolnjhpnblkcekpdkpa 注意&#xff0c;必须用谷歌浏览器&#xff0c;…

安达发|APS车间排产软件对PCB企业有哪些意义?

PCB(printed circuit board)即印制线路板&#xff0c;简称印制板&#xff0c;是电子工业的重要部件之一。几乎每种电子设备&#xff0c;小到电子手表、计算器&#xff0c;大到计算机、通信电子设备、军用武器系统&#xff0c;只要有集成电路等电子元件&#xff0c;为了使各个元…

中科亿海微乘法器(LPMMULT)

引言 FPGA&#xff08;可编程逻辑门阵列&#xff09;是一种可在硬件级别上重新配置的集成电路。它具有灵活性和可重构性&#xff0c;使其成为处理各种应用的理想选择&#xff0c;包括数字信号处理、图像处理、通信、嵌入式系统等。在FPGA中&#xff0c;乘法器是一种重要的硬件资…

WPS-0DAY-20230809的分析和利用复现

WPS-0DAY-20230809的分析和初步复现 一、漏洞学习1、本地复现环境过程 2、代码解析1.htmlexp.py 3、通过修改shellcode拿shell曲折的学习msf生成sc 二、疑点1、问题2、我的测试测试方法测试结果 一、漏洞学习 强调&#xff1a;以下内容仅供学习和测试&#xff0c;一切行为均在…

STM32CubeMX之freeRTOS中断系统

任何中断的优先级都大于任务 优先级是从5-15 而不是0-15 因为前几个已经被freertos所控制了&#xff0c;因为操作系统不是万能的&#xff0c;所以我们需要弄一些中断凌驾在我们操作系统之上&#xff0c;中断中必须使用中断相关的函数&#xff01; 中断不能使用阻塞函数&#…

数据结构:力扣OJ题

目录 ​编辑题一&#xff1a;链表分割 思路一&#xff1a; 题二&#xff1a;相交链表 思路一&#xff1a; 题三&#xff1a;环形链表 思路一&#xff1a; 题四&#xff1a;链表的回文结构 思路一&#xff1a; 链表反转&#xff1a; 查找中间节点&#xff1a; 本人实力…

特语云用Linux和MCSM面板搭建 我的世界基岩版插件服 教程

Linux系统 用MCSM和DockerWine 搭建 我的世界 LiteLoaderBDS 服务器 Minecraft Bedrock Edition 也就是我的世界基岩版&#xff0c;这是 Minecraft 的另一个版本。Minecraft 基岩版可以运行在 Win10、Android、iOS、XBox、switch。基岩版不能使用 Java 版的服务器&#xff0c;…

Java多线程(十)

目录 一、synchronized基本特点 二、synchronized加锁工作过程 2.1 无锁 2.2 偏向锁 2.3 轻量级锁 2.4 重量级锁 三、synchronized其他优化操作 3.1 锁消除 3.2 锁粗化 一、synchronized基本特点 开始是乐观锁&#xff0c;如果锁冲突频繁就会转换成悲观锁开始是轻量级锁&#x…

python小白之matplotlib使用实战项目:随机漫步

文章目录 随机漫步1.1 创建RandomWalk类1.2 选择方向1.3 绘制随机漫步图1.4 模拟多次随机漫步1.5 设置随机漫步图样式1.5.1 给点着色1.5.2 重新绘制起点和终点1.5.3 隐藏坐标轴1.5.4 增加点数1.5.5 调整图片尺寸以适应屏幕 附录&#xff08;项目代码&#xff09;random_walk.py…

Linux 外部命令 - cat

Linux 外部命令 cat 英文帮助 NAME cat - concatenate files and print on the standard output SYNOPSIS cat [OPTION]... [FILE]... DESCRIPTION Concatenate FILE(s) to standard output. With no FILE, or when FILE is -, read standard input.…

ChatAI的几十种高级用法,可能是比较全的了(文末送书)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

【Kafka】1.Kafka简介及安装

目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;、基于 zookeeper 协调…

消息中间件 —— 初识Kafka

文章目录 1、Kafka简介1.1、消息队列1.1.1、为什么要有消息队列&#xff1f;1.1.2、消息队列1.1.3、消息队列的分类1.1.4、p2p 和 发布订阅MQ的比较1.1.5、消息系统的使用场景1.1.6、常见的消息系统 1.2、Kafka简介1.2.1、简介1.2.2、设计目标1.2.3、kafka核心的概念 2、Kafka的…

Java pb3中 int类型的字段值0怎么判断是未设置值还是设置了值0

Java pb3中 int类型的字段值0怎么判断是未设置值还是设置了值0 1. 效果图2. 源码参考 Java pb3对 各种类型的默认值进行序列化时省略了。如int类型的字段为0或者null都会省略&#xff0c;但反序列化都可以序列化为0. proto3&#xff0c; required 和 optional 已在新语法中删除…

闲鱼卖货:新手容易踩坑的7个地方。赶紧看看有没有中招?

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 这是我以前的一个学生收到的第一个非法通知。他告诉我&#xff0c;他当时很害怕&#xff0c;…

在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)

文章目录 在 SHELL 脚本中调用另一个 SHELL 脚本&#xff08;报错&#xff1a; go: not found&#xff09;在 SHELL 脚本中调用另一个 SHELL 脚本一个脚本sudo调另外一个脚本&#xff0c;报错&#xff08;报错&#xff1a; go: not found&#xff09; 在 SHELL 脚本中调用另一个…

LNMP简易搭建

目录 前言 一、拓扑图 二、NGINX配置 三、配置MySQL 四、配置php环境 五、部署应用 总结 前言 LNMP平台指的是将Linux、Nginx、MySQL和PHP&#xff08;或者其他的编程语言&#xff0c;如Python、Perl等&#xff09;集成在一起的一种Web服务器环境。它是一种常用的开发和部署网…

Linux使用gdb调试多文件的C程序

【例】通过vi创建两个.c文件main.c和add.c&#xff1a; 一步编译main.c和add.c文件&#xff0c;并加入调试信息&#xff1a; 1. 在被调函数中加断点时&#xff0c;在执行主函数时&#xff0c;会自动进入被调函数 &#xff08;1&#xff09;进入gdb&#xff0c;跟踪main程序&am…

python——案例17:判断某年是否是闰年

案例17&#xff1a;判断某年是否是闰年 判断依据&#xff1a;闰年就是能被400整除&#xff0c;或者能被4整除的年份numint(input(输入年份&#xff1a;))if num%1000: if num%4000: #整百年份的判断print("%s年是闰年"%num) #…

智能优化算法:登山队优化算法-附代码

智能优化算法&#xff1a;登山队优化算法 文章目录 智能优化算法&#xff1a;登山队优化算法1.登山队优化算法1.1 初始化1.2 协作登山1.3灾害威胁1.4协调防御1.5队员更新 2.实验结果3.参考文献4.Matlab5.python 摘要&#xff1a;MTBO 算法是 Faridmehr 等人于 2023 年受登山队员…