vue-router权限控制(简单方式)


Posted in Javascript onOctober 29, 2018

在vue-router控制前端权限是常见需求:

  1. 有一种做法是直接在后端完成判断,提供页面列表和操作列表,在前端进行渲染,但这个方案并不优雅,前后端耦合度比较高。
  2. 比较常见的做法是把登录页面独立在router之外,专门写一个权限控制文件,在登录之后根据用户权限加载router,之后把权限作为参数传入各种组件中,以控制元素的渲染。这个方法比较合理,没有什么额外的开销,只是需要独立写一个登录页面和权限控制文件比较麻烦一些,特别是对一些小项目而言。

我们希望还有更简单的方式。这个时候梳理一下需求,我们的主要目标是:

  1. 菜单栏控制,根据权限渲染可以进入的页面菜单;
  2. 操作按钮权限控制,没有操作权限的不予显示;
  3. 如果有人通过直接点击链接或输入地址进入没有权限的页面,则进行拦截;

第一、第二个目标是容易实现的,把权限列表传入对应组件,通过v-if判断即可,需要解决的是越权页面的拦截问题。在上面常见的做法中,为了实现拦截,单独写了一个登录页面,登录之后再根据权限加载路由,这样,没有权限的路由根本不会加载,于是被导向404页面。

那么,现在的问题是,怎么样会有更简单的方式?

显然,如果我们不想单独写login页面,那么router在登录前就完成加载了。如果无法通过router自动将越权页面导向404页面,我们能做的,只能手动引导了。思路清楚了,实现起来就毫无压力:

根据vue组件的生命周期,我们可以在mounted钩子上进行权限判断,如果通过props传入的用户权限列表没有对应权限,就跳转页面到404:

mounted () {
     if (!this.check_user_privilege (current_page)) {
       this.$Message.error('权限不足');
       this.$router.push('404');
     }
 }

当然,事实上vue-router也提供了页面跳转时的钩子方法,全局的有beforeEach、afterEach等,我们希望直接在组件内使用,则可以使用beforeRouteEnter方法,在进入页面时进行判断,比如:

beforeRouteEnter (to, from, next) {
     next(vm => {
       if (!vm.check_user_privilege (current_page)) {
         vm.$Message.error('权限不足');
         vm.$router.push('404');
       }
     })
   },

具体可以参考[文档]。

当然,就这个例子来说,用vue-router提供的钩子还不如直接在mounted写判断条件,因为beforeRouteEnter方法中的next需要调用组件参数,是在mounted执行之后才执行的,而我们又经常需要在mounted钩子加载页面数据,为了避免浪费,先进行判断是比较好的。

和常用方法相比,简单方法是有额外开销的,主要在于需要完全加载路由,同时在加载页面后进行了一次判断。不过从写代码的角度来说,似乎逻辑上更节约,因为不用另外写一个集中进行权限控制的文件了,至于每个页面的权限判断,那是本来在菜单栏就要做的事情,延伸到不同页面也不算什么负担。

会不会有什么副作用呢?暂时来看似乎是没有的,如果在mounted最开始就进行页面权限判断,也不会有加载越权数据的问题,况且数据权限是后端需要单独判断的,不应该让前端去担心。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery实现瀑布流效果分享
Mar 26 Javascript
教你用jquery实现iframe自适应高度
Jun 11 Javascript
js+html5实现canvas绘制简单矩形的方法
Jun 05 Javascript
JavaScript编写连连看小游戏
Jul 07 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
js判断当前页面用什么浏览器打开的方法
Jan 06 Javascript
JavaScript中的编码和解码函数
Feb 15 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
vue-cli2.9.3 详细教程
Apr 23 Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 Javascript
react 父子组件之间通讯props
Sep 08 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 #Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 #Javascript
vue 本地服务不能被外部IP访问的完美解决方法
Oct 29 #Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 #Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
Oct 29 #Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
Oct 29 #Javascript
简单说说angular.json文件的使用
Oct 29 #Javascript
You might like
php读取数据库信息的几种方法
2008/05/24 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
php for 循环使用的简单实例
2016/06/02 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
JavaScript实现把数字转换成中文
2015/06/29 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
pytorch实现查看当前学习率
2020/06/24 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
自我评价怎么写正确呢?
2013/12/02 职场文书
六一节目主持词
2014/04/01 职场文书
爱我中华教学反思
2014/04/28 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
人民调解协议书范本
2014/10/11 职场文书
限期整改通知书
2015/04/22 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书