关于Vue的路由权限管理的示例代码


Posted in Javascript onMarch 06, 2018

前言

曾经在工作上对 vue 路由权限管理这方面有过研究,这几天又看到了几篇相关的文章,再加上昨天电面中又再一次提及到,就索性整理了一下自己的一些看法,希望对大家有帮助。

实现

大体上实现的思路很简单,先上图:

关于Vue的路由权限管理的示例代码

无非是将路由配置按用户类型分割为 用户路由 和 基本路由,不同的用户类型可能存在不同的 用户路由,具体依赖实际业务。

  1. 用户路由: 当前用户所特有的路由
  2. 基本路由:所有用户均可以访问的路由

实现控制的方式分两种:

通过vue-router addRoutes 方法注入路由实现控制
通过vue-router beforeEach 钩子限制路由跳转

addRoutes 方式:

通过请求服务端获取当前用户路由配置,编码为 vue-router 所支持的基本格式(具体如何编码取决于前后端协商好的数据格式),通过调用 this.$router.addRoutes 方法将编码好的用户路由注入到现有的 vue-router 实例中去,以实现用户路由。

beforeEach 方式

通过请求服务端获取当前用户路由配置,通过注册 router.beforeEach 钩子对路由的每次跳转进行管理,每次跳转都进行检查,如果目标路由不存再于 基本路由 和 当前用户的 用户路由 中,取消跳转,转为跳转错误页。

以上两种方式均需要在 vue-router 中配置错误页,以保证用户感知权限不足。

两种方式的原理其实都是一样的,只不过 addRoutes 方式 通过注入路由配置告诉 vue-router :“当前我们就只有这些路由,其它路由地址我们一概不认”,而 beforeEach 则更多的是依赖我们手动去帮 vue-router 辨别什么页面可以去,什么页面不可以去。说白了也就是 自动 与 手动 的差别。说到这,估计大家都会觉得既然是 自动 的,那肯定是 addRoutes 最方便快捷了,还能简化业务代码,笔者一开始也是这么认为的,但是!很多人都忽略了一点:

关于Vue的路由权限管理的示例代码

addRoutes 方法仅仅是帮你注入新的路由,并没有帮你剔除其它路由!

设想存在这么一种情况:用户在自己电脑上登录了管理员账号,这个时候会向路由中注入管理员的路由,然后再退出登录,保持页面不刷新,改用普通用户账号进行登录,这个时候又会向路由中注入普通用户的路由,那么,在路由中将存在两种用户类型的路由,即使用户不感知,通过改变 url,普通用户也可以访问管理员的页面!

对于这个问题,也有一个解决办法:

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const createRouter = () => new Router({
 mode: 'history',
 routes: []
})
const router = createRouter()
export function resetRouter () {
 const newRouter = createRouter()
 router.matcher = newRouter.matcher
}
export default router

通过新建一个全新的 Router,然后将新的 Router.matcher 赋给当前页面的管理 Router,以达到更新路由配置的目的。

笔者做了一个小demo,大家可以去体验一下。

关于上述问题,在vue-router 的 github issues 下有过讨论,分别是:

Add option to Reset/Delete Routes #1436

Feature request: replace routes dynamically #1234

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

Javascript 相关文章推荐
js 代码优化点滴记录
Feb 19 Javascript
caller和callee的区别介绍及演示结果
Mar 10 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
JavaScript实现将文本框的值插入指定位置的方法
Aug 13 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
基于Vuejs实现购物车功能
Aug 02 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
vue自定义指令的创建和使用方法实例分析
Dec 04 Javascript
JavaScript中如何调用Java方法
Sep 16 Javascript
vue.js在标签属性中插入变量参数的方法
Mar 06 #Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 #Javascript
解决vue build打包之后首页白屏的问题
Mar 06 #Javascript
vue2.0 路由不显示router-view的解决方法
Mar 06 #Javascript
解决vue-router进行build无法正常显示路由页面的问题
Mar 06 #Javascript
解决vue打包项目后刷新404的问题
Mar 06 #Javascript
写一个移动端惯性滑动&回弹Vue导航栏组件 ly-tab
Mar 06 #Javascript
You might like
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
PDO::errorInfo讲解
2019/01/28 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python中的多行注释文档编写风格汇总
2016/06/16 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
TensorFlow实现模型评估
2018/09/07 Python
深入了解python中元类的相关知识
2019/08/29 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
通用求职信范文模板分享
2013/12/27 职场文书
单身联谊活动方案
2014/01/29 职场文书
物流专员岗位职责
2014/02/17 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
浅谈JS的原型和原型链
2021/06/04 Javascript
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis