前言

如何实现权限控制?很多前端同学第一时间会想到实现自定义指令 v-has 或 v-permission。代码大致如下:

Vue.directive("has", {inserted: function(el, binding) {if (!Vue.prototype.$has(binding.value)) {el.parentNode.removeChild(el);}},
});

习惯了这种写法的同学可能觉得并没什么问题,因为已经能“完美” 实现功能。但是细思实现方式,Vue 其实已经帮我们创建了权限元素,只是我们自己再去删而已。

自定义指令的 inserted

Vue 通过虚拟 Dom 创建元素后,会进行绑定指令阶段,回调 bind 时,元素并未 append 到文档中,这就是我们不能再 bind 函数删除 el 的原因。

在调用 inserted 之前,Vue 会将已绑定指令的元素 append 到父元素,整个文档再 append 到 body 时,我们才得以使用 el.parentNode.removeChild(el)。

请看下面的例子。

断点放在inserted ,我们确实看到了提交按钮,但是这个人 Damon 是没有权限的啊。
到这里其实我们可以看出上面方法的问题了。

Vue 创建权限元素 => 插入文档 => Inserted 删除权限元素.

既然是权限控制,我们为什么还要先生成这个权限按钮,然后再删掉呢?

实例代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>权限控制</title>
</head>
<body><script crossorigin="anonymous" src="https://lib.baomitu.com/vue/2.6.14/vue.js"></script><div id="app"><button v-has="'Damon'">提交按钮</button><p>我是 Damon 我没有权限,但是你看到提交按钮了吗?</p></div><script>let permissionList = ['Tom', 'Ross']Vue.directive('has', {bind(el, binding) {let includes = permissionList.includes(binding.value)},inserted(el, binding) {let has = permissionList.includes(binding.value)if (!has) {el.parentNode.removeChild(el);}}})const app = new Vue({})app.$mount('#app')console.log(app)</script>
</body>
</html>

干脆的 v-if

既然自定义的 v-has 会帮我们生成元素,我们可以使用 v-if 代替,把元素的创建扼杀在编译阶段,因为只要 v-if 指令的值为 false,Vue 就不会帮我们创建它。

比如上面的提交按钮:

<button v-if="$has('Damon')">提交按钮</button>

Vue 原型中添加 $has

Vue.prototype.$has = function(text) {return [permissionList].includes(text)
}

结论

在权限控制中,我们需要根据不同用户角色或等级显示或屏蔽权限元素,比如按钮或视图。

我个人认为,在前端做控制,不应该有生成权限元素的过程,但是自定义指令会有创建权限元素的过程,并且我们需要写代码删除它,这无疑是多余的过程。

使用 v-if 可以很好地帮我们解决这个问题。虽然 v-if 很好,但是它也有个不足的地方,在标签的语义上并没有 v-has 直白明显。

后记

如果你有更好的方法,请与我们分享。以上仅为本人对权限控制的实践和思考,在复杂的业务场景不一定适用,如有不当欢迎指正。

为什么我不推荐 v-has 实现权限控制?相关推荐

  1. hive表级权限控制_Hive权限控制和超级管理员的实现

    Hive权限控制 Hive权限机制: Hive从0.10可以通过元数据控制权限.但是Hive的权限控制并不是完全安全的.基本的授权方案的目的是防止用户不小心做了不合适的事情. 先决条件: 为了使用Hi ...

  2. nginx+lua(openresty)实现黑/白名单权限控制

            openresty在nginx基础上集成了很多功能,比如可以直接调用redis,mysql,http接口等服务,比较流行的网关kong就是通过openresty实现的.日常开发和运维离 ...

  3. Java访问权限控制

    面向对象的核心思想之一就是封装,只把有限的方法和成员公开给别人,这也是迪米特法则的内在要求,是外部调用方对方法体内的实现细节知道得尽可能少. 如何实现封装呢? 需要使用某些关键字来限制外部对类内属性和 ...

  4. Spring Boot 2.6之后,动态权限控制终于可以用起来了!

    Spring Security 5.6 发布有些时间了.随着Spring Boot 2.6的发布Spring Security 5.6终于有机会上生产了.在Spring Security 5.6中动态 ...

  5. Keycloak简单几步实现对Spring Boot应用的权限控制

    我们在上一篇初步尝试了keycloak,手动建立了一个名为felord.cn的realm并在该realm下建了一个名为felord的用户.今天就来尝试一下对应的Spring Boot Adapter, ...

  6. elasticsearch使用jetty进行简单的权限控制

    默认elasticsearch是使用netty作为http的容器,由于netty并没有权限模块,所以默认es没有任何的权限控制,直接通过http就可以进行任何操作,除非把http禁用.但如果你使用el ...

  7. 为CDH 5.7集群添加Kerberos身份验证及Sentry权限控制

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 4. 为CDH 5集群添加Kerberos身份验证 4.1 安装sentry 1.点击"操作",&qu ...

  8. Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制

    思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...

  9. SQL Server使用视图做权限控制

    问题引入 这天老鸟火急火燎的跑到菜鸟旁边,想必是遇到什么难题了:"现在有这么一个场景,假如有三种角色,并且存在层级关系,他们需要访问同一个数据源表,但是需要做权限控制,使得每种角色只能看到自 ...

最新文章

  1. 二分算法,选择,冒泡排序算法
  2. CodeSign error: code signing is required for product type Application in SDK iOS
  3. 轻量级的日期时间控件Pikaday
  4. Django的主要开发流程(以扩充用户模型为例)
  5. 利用python爬虫(案例8)--今天就是吃X我也要搞到有道
  6. canvas学习之柱状图
  7. 《硝烟中的Scrum和XP》学习手札
  8. JVM学习-Java内存模型JMM
  9. CODE[VS] 1979 第K个数
  10. 关机应用程序无法关闭计算机,电脑关机时怎么设置自动结束没有响应的应用程序?...
  11. linux做伪分布时ip设置,Linux下伪分布模式的Hadoop部署
  12. Android 利用SurfaceView进行图形绘制
  13. 算法导论笔记(四)算法分析常用符号
  14. DateUtils 工具类
  15. php查netstat,Netstat命令详解
  16. RescuePRO Deluxe(闪迪数据恢复) v6.0.3.1中文破解版
  17. 11部门公布第三批111个国家新型城镇化综合试点名单和工作方案
  18. scrapy抓取贝壳找房租房数据
  19. Android RxJava应用:优雅实现网络请求嵌套回调
  20. 推荐几个常用常玩的小游戏网址包括4399.com

热门文章

  1. leetCode2611. 老鼠和奶酪
  2. matlab文件名加前缀_利用MATLAB批量对文件重命名
  3. Vmware 安装 Ubuntu 虚拟机常用配置
  4. 弘辽科技:淘宝的各个级别的店铺有多少自然流量?具体解答
  5. STM32F7 MPU笔记
  6. 机器学习作业9 - 自动确定k值的k均值聚类
  7. 隐藏多余的字用 “省略号” 代替
  8. HTML用乘法函数,excel乘法函数-这两个乘积函数技巧,办公时特别实用,但擅长的人不多...
  9. 阐述矩阵初等变换方法在线性代数中的应用
  10. 大学毕业生到底要不要选择3D建模?