vue路由权限校验功能的实现代码


Posted in Javascript onJune 07, 2020

引言

做后台系统的时候,难免会有用户权限的判断。admin可以查看全部菜单,user只能查看部分菜单。

一开始接触这个需求的时候,完全是纯前端做的。在配置路由的时候,加一个roles的属性,通过判断用户的roles是否与路由的roles属性相匹配来作为显示隐藏的依据

{
 path: '/router',
 name: 'router',
 meta: {
 title: '标题',
 roles: ['admin','user']
 },
 component: index,
 children: [
 {
 path: 'children',
 name: 'children',
 meta: {
 title: '子标题',
 roles: ['admin','user']
 },
 component: child
 }
 ]
}
// 过滤路由 menuList-菜单 roles-用户角色
const checkMenuList = (menuList, roles) => {
 for (let i = 0; i < menuList.length; i++) {
 if (!compareEqual(roles, menuList[i].meta.roles) || menuList[i].meta.noRenderTree) {
 menuList.splice(i, 1)
 i -= 1
 } else {
 if (menuList[i].children) {
 checkMenuList(menuList[i].children, roles)
 }
 }
 }
 return menuList
}

这样做确实可以实现给不同用户展示不同的菜单。但是如果用户权限发生改变,前端就需要发版。本着万物皆可灵活配置的原则。

需求

首先我们要了解,我们要做什么。

我们希望我们可以通过用户权限配置功能,达到灵活配置路由权限,由服务器端返回需要展示的路由权限,前端做展示。

思路

  • 前端配置好项目全部页面的路由
  • 服务器端返回该用户的权限列表,前端去匹配,最后返回一个路由列表,作为菜单
  • 为了更好的用户体验,当用户输入异常的路由时,我们要重定向到一个404页面,提示用户该页面不存在。
  • 基于第3点,我们在每次跳转的时候,还需要判断这个页面是否存在,该用户是否有权限进行跳转

实现

ok 思路整理完了。现在就开始来实现吧!

首先,routers是需要在前端注册,我们要先配置整个页面的routers。

除了系统的菜单之外,我们还需要配置403错误页面,还有login、首页这些基本路由。由于系统菜单还需要与服务器端返回的路由列表进行匹配,暂时不进行注册

// router.js

 // 基本路由
export const defaultRouter = [
 { path: '/', component: index }, // 首页
 { path: '/login', name: 'login', component: login } // 登录页
 ]
 
 // 项目全部页面
export const appRouter = [
 {
 path: '/router1',
 name: 'router1',
 redirect: '/router1/test1',
 component: router1,
 meta: { title: '路由1'},
 children: [
 { path: 'test1', name: 'test1', component: test1, meta: { title: '测试1' } },
 { path: 'test2', name: 'test2', component: test1, meta: { title: '测试2' } }
 ]
 },
 ]
 // 这个是我们页面初始化时候,注册的routes
const routers = [ 
 ...defaultRouter
]
const RouterConfig = {
 routes: routers
}
const router = new VueRouter(RouterConfig)

全部路由都注册完了,接下来就要匹配用户可访问的路由了,这一步需要和服务器端一起约定规则。

// 服务器端返回的键值对: 路由名:是否有权限
authRouter:{
 'test1': false,
 'test2': true
}

拿到服务器端返回的用户权限之后,就开始过滤路由

// 过滤路由 appRouterCopy-项目全部页面 authRouter-权限列表
const checkMenuList = (appRouterCopy, authRouter) => {
 for (let i = 0; i < appRouterCopy.length; i++) {
 let {name, children} = appRouterCopy[i]
 if (authRouter[name] === false) {
  appRouterCopy.splice(i, 1)
  i--
 } else if (children && children.length) {
  checkMenuList(children, authRouter)
 }
 }
}

得到过滤后的路由之后,使用addRoutes进行注册。注意404路由配置要在最后加上。

let error404Page = { path: '/*', name: 'error-404', meta: 
{ 
title: '404-页面不存在'}, component: error404Page
}
router.addRoutes([...appRouterCopy, error404Page])

到此我们就得到了用户有权限的页面了,可以把得到的列表作为系统菜单渲染上去。接下来就要处理一下跳转异常的状况了。需要用到beforeEach对每次跳转进行拦截判断

router.beforeEach(((to, from, next) => {
 if (isNotLog && to.name !== 'login') {
 // 未登录 跳转到登录页
  next({ name: 'login' })
 } else if (to.name && (to.name === 'login' || to.name.indexOf('error') !== -1)){
 // 跳转异常
 next()
 } else {
 // 校验用户权限
 checkUser(next, to ,router)
 }
})

const checkUser = async (next, to ,router) => {
 if (isNotUser) {
 // 首次登陆系统,没有用户信息的时候 需要获取用户信息做过滤路由的操作
 const authRouter = getAuthRouter() // 获取用户权限
 checkMenuList(appRouterCopy, authRouter)
 const error404Page = { path: '/*', name: 'error-404', meta: { title: '404-页面不存在'}, component: error404Page}
 router.addRoutes([...appRouterCopy, error404Page])
 if (!appRouterCopy.length) {
  // 用户没有有权限的路由 可以跳转到404或者登录页
  next({ ...error404Page, replace: true })
 } else {
  next({ ...to, replace: true })
 }
 } else {
 next()
 }
}

总结

到此这篇关于vue路由权限校验功能的实现代码的文章就介绍到这了,更多相关vue路由权限校验内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JQuery this 和 $(this) 的区别
Aug 23 Javascript
jquery实现右键菜单插件
Mar 29 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
浅谈Sizzle的“编译原理”
Apr 14 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
Jan 21 Javascript
jQuery的层级查找方式分析
Jun 16 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 Javascript
用Webpack构建Vue项目的实践
Nov 07 Javascript
微信小程序实现上拉加载功能
Nov 20 Javascript
5种方法告诉你如何使JavaScript 代码库更干净
Sep 15 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 #Javascript
JS原型对象操作实例分析
Jun 06 #Javascript
JS中的继承操作实例总结
Jun 06 #Javascript
ES6 async、await的基本使用方法示例
Jun 06 #Javascript
JS 数组和对象的深拷贝操作示例
Jun 06 #Javascript
ES6 Generator基本使用方法示例
Jun 06 #Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 #jQuery
You might like
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
公司周年庆典邀请函
2014/01/12 职场文书
大学生活动策划方案
2014/02/10 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
教师岗位职责
2015/02/03 职场文书
简历中自我评价范文
2015/03/11 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
暖春观后感
2015/06/08 职场文书
法制主题班会教案
2015/08/13 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技