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 相关文章推荐
JavaScript事件处理器中的event参数使用介绍
May 24 Javascript
JavaScript打印iframe内容示例代码
Aug 20 Javascript
使用js显示当前时间示例
Mar 02 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
js实现仿阿里巴巴城市选择框效果实例
Jun 24 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
Jan 27 Javascript
原生js实现可拖拽效果
Feb 28 Javascript
js获取css的各种样式并且设置他们的方法
Aug 22 Javascript
p5.js绘制创意自画像
Nov 04 Javascript
JS window对象简单操作完整示例
Jan 14 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
JS前端广告拦截实现原理解析
Feb 17 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
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
Javascript writable特性介绍
2015/02/27 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
js中less常用的方法小结
2017/08/09 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
Django celery异步任务实现代码示例
2020/11/26 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
秋季运动会活动方案
2014/02/05 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
心理学培训心得体会
2016/01/22 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL