基于Vue自定义指令实现按钮级权限控制思路详解


Posted in Javascript onMay 23, 2018

思路:

  • 登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到sessionStorage中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个 user_info 的接口来获取用户的详细信息(如用户权限,用户名等等信息)。
  • 权限验证:通过token获取用户对应的 role,自定义指令,获取路由meta属性里btnPermissions( 注: meta.btnPermissions是存放按钮权限的数组,在路由表里配置 ),然后判断role是否在btnPermissions数组里,若不在即删除该按钮DOM。

按钮权限也可以用v-if判断,但是如果页面过多,每个页面页面都要获取用户权限role和路由表里的meta.btnPermissions,然后再做判断,感觉有点麻烦,而自定义指令,只需在权限按钮加入该指令即可。

废话不多说,上代码...

路由配置:

path: '/permission',
  component: Layout,
  name: '权限测试',
  meta: { btnPermissions: ['admin','supper','normal'] }, //页面需要的权限
  children: [
   {
    path: 'supper',
    component: _import('system/supper'),
    name: '权限测试页',
    meta: { btnPermissions: ['admin','supper'] } //页面需要的权限
   },
   {
    path: 'normal',
    component: _import('system/normal'),
    name: '权限测试页',
    meta: { btnPermissions: ['admin'] } //页面需要的权限
   }
  ]

自定义指令:

import Vue from 'vue'
/**权限指令**/
const has = Vue.directive('has', {
 bind: function (el, binding, vnode) {
  // 获取按钮权限
  let btnPermissions = vnode.context.$route.meta.btnPermissions.split(",");
  if (!Vue.prototype.$_has(btnPermissions)) {
   el.parentNode.removeChild(el);
  }
 }
});
// 权限检查方法
Vue.prototype.$_has = function (value) {
 let isExist = false;
 let btnPermissionsStr = sessionStorage.getItem("btnPermissions");
 if (btnPermissionsStr == undefined || btnPermissionsStr == null) {
  return false;
 }
 if (value.indexOf(btnPermissionsStr) > -1) {
  isExist = true;
 }
 return isExist;
};
export {has}

然后在main.js文件引入文件

import has from './public/js/btnPermissions.js';

页面中按钮只需加v-has即可

<el-button @click='editClick' type="primary" v-has>编辑</el-button>

结语:

权限这种事需要前后端结合,前端尽可能的去控制,记住:永远不相信用户输入!

以上所述是小编给大家介绍的基于Vue自定义指令实现按钮级权限控制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
用js得到网页中所有的div的id
Oct 19 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
浅谈jquery.fn.extend与jquery.extend区别
Jul 13 Javascript
微信小程序  audio音频播放详解及实例
Nov 02 Javascript
AngulerJS学习之按需动态加载文件
Feb 13 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 Javascript
vuex实现购物车功能
Jun 28 Javascript
详解React+Koa实现服务端渲染(SSR)
May 23 #Javascript
JavaScript+H5实现微信摇一摇功能
May 23 #Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 #Javascript
vue动态路由配置及路由传参的方式
May 23 #Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
May 23 #Javascript
深入剖析Node.js cluster模块
May 23 #Javascript
Node.js进阶之核心模块https入门
May 23 #Javascript
You might like
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
php头像上传预览实例代码
2017/05/02 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
JS脚本defer的作用示例介绍
2014/01/02 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
python中星号变量的几种特殊用法
2016/09/07 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
对python 自定义协议的方法详解
2019/02/13 Python
Python 下载及安装详细步骤
2019/11/04 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
Python安装Bs4的多种方法
2020/11/28 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
乡镇交通安全实施方案
2014/03/29 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
内科护士节演讲稿
2014/09/11 职场文书
统计员岗位职责范本
2015/04/14 职场文书
妈妈别哭观后感
2015/06/08 职场文书
在人间读书笔记
2015/06/30 职场文书