Vue项目实现简单的权限控制管理功能


Posted in Javascript onJuly 17, 2019

在Vue项目中实现权限控制管理

对于一般稍大一些的后台管理系统,往往有很多个人员需要使用,而不同的人员也对应了不同的权限系统,后端的权限校验保障了系统的安全性,而前端的权限校验则提供了优秀的交互体验。

校验方式

前端对用户的权限信息进行校验往往在两个方面进行限制

  • 路由不可见
  • 元素不可见

通过以上两个方式,来将用户权限之外的内容隐藏掉。

路由不可见实现方法

在router.js中的meta字段中加入该路由的访问权限列表

{
  path: 'edit',
  name: 'edit',
  meta: {
    title: '编辑账户',
    auths:['edit_account']
  },
  component: () => import('pathToComponent/component.vue'),
},

Vue.router中提供了导航守卫,我们这里使用 全局前置守卫 对路由跳转进行权限校验

router.beforeEach(to,from,next)

参数 to 是即将进入的路由对象,我们可以在对象中拿到之前在router.js中定义的 route 对象,并获得 auths 字段

router.beforeEach((to,from,next)=>{
  const hasAuth = function(needAuths,haveAuths){   //判断用户是否拥有权限的function
    // implement 
  }
  const havaAuths = []; // 用户拥有的权限列表
  if(!hasAuth(to.meta.auths,haveAuths)){
    //没有权限重定位到其他页面,往往是401页面
    next({replace:true,name:'otherRouteName'})
  }
  //权限校验通过,跳转至对应路由
  next();
})

在有侧边栏的后台管理中,还需要对侧边栏的路由导航进行隐藏,这里同样是通过拿到 route.meta.auths 字段进行过滤。

元素不可见实现方法

因为某些页面中会有一些特殊的接口调用或数据展示受到权限控制显示。前端通过控制元素的展示来隐藏掉用户不具有权限的元素,避免点击了某一个button导致接口401报错这样不友好的交互体验。

全局注册一个directive, directive官网介绍 。

//acl.js
const aclDirective = {
  inserted:function(el,binding){ // 在被绑定的元素插入到dom中时
    const hasAuth = function(needAuths,haveAuths){ //判断用户是否拥有权限的function
      // implement 
    }
    const havaAuths = []; // 用户拥有的权限列表
    if(!hasAuth(binding.value,haveAuths)){ //binding.value 可以获得绑定指令时传入的参数
      el.style = "display:none"; //修改元素的可见状态
    }
  }
}
//main.js
Vue.directive('acl',aclDirective); //全局注册指令

在需要控制显示的组件上我们就可以通过 v-acl 进行权限控制

<button v-acl="['edit_access']">编辑账户</button>

总结

以上所述是小编给大家介绍的Vue项目实现简单的权限控制管理功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
清空上传控件input file的值
Jul 03 Javascript
js读写(删除)Cookie实例详解
Apr 17 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
浅谈javascript中的加减时间
Jul 12 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
Vue.js双向绑定实现原理详解
Dec 22 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
浅析vue component 组件使用
Mar 06 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
基于js中style.width与offsetWidth的区别(详解)
Nov 12 Javascript
Angular 组件之间的交互的示例代码
Mar 24 Javascript
Vue Router 实现动态路由和常见问题及解决方法
Mar 06 Javascript
百度小程序自定义通用toast组件
Jul 17 #Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 #Javascript
JS实现返回上一页并刷新页面的方法分析
Jul 16 #Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
Jul 16 #Javascript
微信小程序-API接口安全详解
Jul 16 #Javascript
jquery实现垂直无限轮播的方法分析
Jul 16 #jQuery
JavaScript解析JSON数据示例
Jul 16 #Javascript
You might like
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python制作爬虫抓取美女图
2016/01/20 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
实习护士自荐信
2015/03/25 职场文书
了解Redis常见应用场景
2021/06/23 Redis
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers