关于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 相关文章推荐
JQUERY CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
javascript工具库代码
Mar 29 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 Javascript
AngularJS表单提交实例详解
Feb 18 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
vue修改Element的el-table样式的4种方法
Sep 17 Javascript
element-ui中el-upload多文件一次性上传的实现
Dec 02 Javascript
vue中如何自定义右键菜单详解
Dec 08 Vue.js
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
MutationObserver在页面水印实现起到的作用详解
Jul 07 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
有关PHP中MVC的开发经验分享
2012/05/17 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
点图片上一页下一页翻页效果
2008/07/09 Javascript
基于jquery & json的省市区联动代码
2012/06/26 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
django 外键model的互相读取方法
2018/12/15 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
PHP统计代码行数的小代码
2019/09/19 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
python 安装impala包步骤
2020/03/28 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
Python之Sklearn使用入门教程
2021/02/19 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
高中生自我评价个人范文
2013/11/09 职场文书
经济管理专业毕业生推荐信
2013/11/11 职场文书
采购助理岗位职责
2014/02/16 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
辞职信格式模板
2015/02/27 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
Docker下安装Oracle19c
2022/04/13 Servers
什么是css原子化,有什么用?
2022/04/24 HTML / CSS