为什么我不推荐 v-has 实现权限控制?
前言
如何实现权限控制?很多前端同学第一时间会想到实现自定义指令 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 实现权限控制?相关推荐
- hive表级权限控制_Hive权限控制和超级管理员的实现
Hive权限控制 Hive权限机制: Hive从0.10可以通过元数据控制权限.但是Hive的权限控制并不是完全安全的.基本的授权方案的目的是防止用户不小心做了不合适的事情. 先决条件: 为了使用Hi ...
- nginx+lua(openresty)实现黑/白名单权限控制
openresty在nginx基础上集成了很多功能,比如可以直接调用redis,mysql,http接口等服务,比较流行的网关kong就是通过openresty实现的.日常开发和运维离 ...
- Java访问权限控制
面向对象的核心思想之一就是封装,只把有限的方法和成员公开给别人,这也是迪米特法则的内在要求,是外部调用方对方法体内的实现细节知道得尽可能少. 如何实现封装呢? 需要使用某些关键字来限制外部对类内属性和 ...
- Spring Boot 2.6之后,动态权限控制终于可以用起来了!
Spring Security 5.6 发布有些时间了.随着Spring Boot 2.6的发布Spring Security 5.6终于有机会上生产了.在Spring Security 5.6中动态 ...
- Keycloak简单几步实现对Spring Boot应用的权限控制
我们在上一篇初步尝试了keycloak,手动建立了一个名为felord.cn的realm并在该realm下建了一个名为felord的用户.今天就来尝试一下对应的Spring Boot Adapter, ...
- elasticsearch使用jetty进行简单的权限控制
默认elasticsearch是使用netty作为http的容器,由于netty并没有权限模块,所以默认es没有任何的权限控制,直接通过http就可以进行任何操作,除非把http禁用.但如果你使用el ...
- 为CDH 5.7集群添加Kerberos身份验证及Sentry权限控制
转载请注明出处:http://www.cnblogs.com/xiaodf/ 4. 为CDH 5集群添加Kerberos身份验证 4.1 安装sentry 1.点击"操作",&qu ...
- Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制
思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...
- SQL Server使用视图做权限控制
问题引入 这天老鸟火急火燎的跑到菜鸟旁边,想必是遇到什么难题了:"现在有这么一个场景,假如有三种角色,并且存在层级关系,他们需要访问同一个数据源表,但是需要做权限控制,使得每种角色只能看到自 ...
最新文章
- 二分算法,选择,冒泡排序算法
- CodeSign error: code signing is required for product type Application in SDK iOS
- 轻量级的日期时间控件Pikaday
- Django的主要开发流程(以扩充用户模型为例)
- 利用python爬虫(案例8)--今天就是吃X我也要搞到有道
- canvas学习之柱状图
- 《硝烟中的Scrum和XP》学习手札
- JVM学习-Java内存模型JMM
- CODE[VS] 1979 第K个数
- 关机应用程序无法关闭计算机,电脑关机时怎么设置自动结束没有响应的应用程序?...
- linux做伪分布时ip设置,Linux下伪分布模式的Hadoop部署
- Android 利用SurfaceView进行图形绘制
- 算法导论笔记(四)算法分析常用符号
- DateUtils 工具类
- php查netstat,Netstat命令详解
- RescuePRO Deluxe(闪迪数据恢复) v6.0.3.1中文破解版
- 11部门公布第三批111个国家新型城镇化综合试点名单和工作方案
- scrapy抓取贝壳找房租房数据
- Android RxJava应用:优雅实现网络请求嵌套回调
- 推荐几个常用常玩的小游戏网址包括4399.com
热门文章
- leetCode2611. 老鼠和奶酪
- matlab文件名加前缀_利用MATLAB批量对文件重命名
- Vmware 安装 Ubuntu 虚拟机常用配置
- 弘辽科技:淘宝的各个级别的店铺有多少自然流量?具体解答
- STM32F7 MPU笔记
- 机器学习作业9 - 自动确定k值的k均值聚类
- 隐藏多余的字用 “省略号” 代替
- HTML用乘法函数,excel乘法函数-这两个乘积函数技巧,办公时特别实用,但擅长的人不多...
- 阐述矩阵初等变换方法在线性代数中的应用
- 大学毕业生到底要不要选择3D建模?