关于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展开闭合效果演示代码
Jul 24 Javascript
如何获取网站icon有哪些可行的方法
Jun 05 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
Jun 07 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
javascript 小数乘法结果错误的处理方法
Jul 28 Javascript
jQuery DOM节点的遍历方法小结
Aug 15 jQuery
9种改善AngularJS性能的方法
Nov 28 Javascript
vue实现简单loading进度条
Jun 06 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
vue开发环境配置跨域的方法步骤
Jan 16 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
Aug 14 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
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
如何使用PHP往windows中添加用户
2006/12/06 PHP
php文件操作实例代码
2012/05/10 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
Node接收电子邮件的实例代码
2017/07/21 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
Python argv用法详解
2016/01/08 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
军训 自我鉴定
2014/02/03 职场文书
班级团队活动方案
2014/08/14 职场文书
武夷山导游词
2015/02/03 职场文书
英语导游欢迎词
2015/09/30 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技