关于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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
js传参数受特殊字符影响错误的解决方法
Oct 21 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
Nov 22 Javascript
js中判断对象是否为空的三种实现方法
Dec 23 Javascript
深入探密Javascript数组方法
Jan 08 Javascript
javascript中caller和callee详解
Aug 10 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
input file上传 图片预览功能实例代码
Oct 25 Javascript
微信小程序 页面跳转传值实现代码
Jul 27 Javascript
使用Node.js实现ORM的一种思路详解(图文)
Oct 24 Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
Oct 24 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之第一天
2006/10/09 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
jquery 常用操作方法
2010/01/28 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
Python 数据结构之队列的实现
2017/01/22 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
python中def是做什么的
2020/06/10 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
前台接待岗位职责
2013/12/03 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
《海上日出》教学反思
2016/02/23 职场文书
高一作文之乐趣
2019/11/21 职场文书
MySQL数据库简介与基本操作
2022/05/30 MySQL