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队列queue与原生模仿其实现方法分享
Mar 25 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
Oct 30 Javascript
JavaScript插件化开发教程 (三)
Jan 27 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
详解js实现线段交点的三种算法
Aug 09 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
Mar 06 jQuery
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
浅谈微信小程序flex布局基础
Sep 10 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php实现可逆加密的方法
2015/08/11 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
php中数组最简单的使用方法
2020/12/27 PHP
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python实现感知器算法详解
2017/12/19 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python通过zabbix api获取主机
2018/09/17 Python
python 内置模块详解
2019/01/01 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Pytorch to(device)用法
2020/01/08 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
2014年教师节寄语
2014/04/03 职场文书
大专生找工作自荐书
2014/06/10 职场文书
房屋买卖协议样本
2014/11/16 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP