概述

  • 角色:超级管理员、主题管理员、数据服务管理员
  • 权限:
    超级管理员:所有页面
    主题管理员:基础公共页面+主题设置页
    数据服务管理员:基础公共页面+数据服务设置页+数据服务审批页
  • 需求:角色菜单来自后端,当用户未通过页面菜单,直接从地址栏访问非权限范围内的url时,拦截用户访问并重定向到首页。

实际系统中还有几种管理员,此处略去,以精简描述。

原本想用动态路由的思路去做,按权限加载对应路由表,但是由于权限可以交叉(比如一个人可以同时是主题管理员和数据服务管理员),导致权限路由表还是得去做判断组合。于是放弃了这个思路,索性就在beforeEach里直接判断了。

实现

路由概览

// index.js
import Vue from 'vue'
import Router from 'vue-router'import LabelMarket from './modules/label-market'
import PersonalCenter from './modules/personal-center'
import SystemSetting from './modules/system-setting'import API from '@/utils/api'Vue.use(Router)const routes = [{path: '/label',component: () => import(/* webpackChunkName: "index" */ '@/views/index.vue'),redirect: { name: 'LabelMarket' },children: [{ // 基础公共页面path: 'label-market',name: 'LabelMarket',component: () => import(/* webpackChunkName: "label-market" */ '@/components/page-layout/OneColLayout.vue'),redirect: { name: 'LabelMarketIndex' },children: LabelMarket},{ // 个人中心path: 'personal-center',name: 'PersonalCenter',redirect: '/label/personal-center/my-apply',component: () => import(/* webpackChunkName: "personal-center" */ '@/components/page-layout/TwoColLayout.vue'),children: PersonalCenter},{ // 系统设置path: 'system-setting',name: 'SystemSetting',redirect: '/label/system-setting/theme',component: () => import(/* webpackChunkName: "system-setting" */ '@/components/page-layout/TwoColLayout.vue'),children: SystemSetting}]},{path: '*',redirect: '/label'}
]const router = new Router({ mode: 'history', routes })
// personal-center.js
export default [...{ // 我的审批path: 'my-approve',name: 'PersonalCenterMyApprove',component: () => import(/* webpackChunkName: "personal-center" */ '@/views/personal-center/index.vue'),children: [{ // 数据服务审批path: 'api',name: 'PersonalCenterMyApproveApi',meta: {requireAuth: true,authRole: 'dataServiceAdmin'},component: () => import(/* webpackChunkName: "personal-center" */ '@/views/personal-center/api-approve/index.vue')},...]}
]
export default [...{ // 数据服务设置path: 'api',name: 'SystemSettingApi',meta: {requireAuth: true,authRole: 'dataServiceAdmin'},component: () => import(/* webpackChunkName: "system-setting" */ '@/views/system-setting/api/index.vue')},{ // 主题设置path: 'theme',name: 'SystemSettingTheme',meta: {requireAuth: true,authRole: 'topicAdmin'},component: () => import(/* webpackChunkName: "system-setting" */ '@/views/system-setting/theme/index.vue')},...
]

鉴权判断

用户登陆信息请求后端接口,返回菜单、权限、版权信息等公共信息,存入vuex。此处用到权限字段如下:

_userInfo: {admin:false, // 是否超级管理员dataServiceAdmin:true, // 是否数据服务管理员topicAdmin:false // 是否主题管理员
}

权限判断逻辑如下:

  1. 判断当前路由是否需要鉴权(router中meta字段下requireAuth是否为true),让公共页面直接放行;
  2. 判断角色是超级管理员,直接放行;
  3. (本系统特殊逻辑)判断跳转路径是主题设置但角色不为主题管理员,继续判断角色是否为数据服务管理员,跳转数据服务设置页or重定向(‘系统设置’菜单'/label/system-setting'默认重定向到'/label/system-setting/theme',其他菜单默认重定向的都是基础公共页面,故需要对这里的重定向鉴权。系统设置的权限不是主题管理员就一定是数据服务管理员,所以能这样做);
  4. 判断路由需求权限是否符合,若不符合直接重定向。
// index.js
router.beforeEach(async (to, from, next) => {try {// get user login infoconst _userInfo = await API.get('/common/query/menu', {}, false)router.app.$store.dispatch('setLoginUser', _userInfo)if (_userInfo && Object.keys(_userInfo).length > 0 &&to.matched.some(record => record.meta.requireAuth)) {if (_userInfo.admin) { // super admin can passnext()} else if (to.fullPath === '/label/system-setting/theme' &&!_userInfo.topicAdmin) {if (_userInfo.dataServiceAdmin) {next({ path: '/label/system-setting/api' })} else {next({ path: '/label' })}} else if (!(_userInfo[to.meta.authRole])) {next({ path: '/label' })}}} catch (e) {router.app.$message.error('获取用户登陆信息失败!')}next()
})

vue router 路由鉴权(非动态路由)相关推荐

  1. Vue/React实现路由鉴权/导航守卫/路由拦截(react-router v6)

    欢迎来到我的博客

  2. dispatch作用 react_「React系列」手把手带你撸后台系统(Redux与路由鉴权)

    [React系列]手把手带你撸后台系统(Redux与路由鉴权) 来源:https://juejin.im/post/5d9b5ddee51d45781b63b8f7 上一篇我们介绍了系统架构,这一篇将 ...

  3. vue路由第三篇-导航守卫、路由元信息、动态路由

    导航守卫 1. 环境准备 1.1 安装Element-Plus npm install element-plus 1.2 注册Element-Plush 需要在 main.ts 文件中注册 impor ...

  4. react路由鉴权 / 路由守卫

    react路由鉴权 / 路由守卫 首先路由鉴权就是在访问一个页面时判断是否需要权限,比如电商App结算账单的时候需要登录用户的账号 路由守卫就是在该页面需要登录用户的情况下去判断是否登录 总的来说就是 ...

  5. react路由鉴权 / 路由守卫(常用经实践可行 推荐阅读)

    react路由鉴权 / 路由守卫 首先路由鉴权就是在访问一个页面时判断是否需要权限,比如电商App结算账单的时候需要登录用户的账号 路由守卫就是在该页面需要登录用户的情况下去判断是否登录 总的来说就是 ...

  6. react 路由鉴权

    react 路由鉴权:就相当于vue里面的 beforeRouter 路由守卫,如果没有登录就不会让用户进到首页,并且会重定向到登录页. // 在 components 文件夹下新建 AuthComp ...

  7. 七十三、Vue项目城市详细页的动态路由,Banner布局和公用图片画廊组件拆分

    2020/11/04. 周四.今天又是奋斗的一天. @Author:Runsen 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的.大四弃算法转前端,需要每天的 ...

  8. Vue3(撩课学院)笔记07-vueRouter路由,创建路由,路由重定向,路由跳转,动态路由,路由懒加载,路由嵌套,路由参数穿传递的两种形式,通过事件来跳转路由

    1.vueRouter路由的两种模式 哈希模式:以#号分割,前端路由一般用hash模式比较多,可以兼容ie8以上,井号后面不发起请求 历史模式:putstate()和replaceState()方法入 ...

  9. Angular中使用JS实现路由跳转、动态路由传值、get方式传值

    场景 Angular介绍.安装Angular Cli.创建Angular项目入门教程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  10. 路由(二)——动态路由简介与RIP协议

    路由(二)--动态路由之RIP.OSPF 一.动态路由 1.简介 2.特点 二.动态路由协议 1.简介 2.原理 3.度量 4.优缺点 5.按照路由执行算法分类 三.RIP路由协议 1.简介 2.水平 ...

最新文章

  1. VMware 使用
  2. 初涉c#设计模式-proxy pattern-从中国足球黑哨开始
  3. 我的世界java版forge放在哪_我的世界1.9forge安装 怎么装forge教程
  4. layui分页limit不显示_layui table分页 page为false时,limit问题
  5. struts2学习(3)struts2核心知识II
  6. 笑谈软件工程:烽烟中的敏捷
  7. 福建省计算机类考生,福建一档多投对考生是有利的,“滑档”的锅甩给计算机吗?...
  8. 大龄开发者究竟该何去何从?2019年Python全栈工程师,都是开发人员改怎么转向高收入?
  9. #HTTP协议学习# (六)代理
  10. String.format(“0:D2}“,a)字符串格式化
  11. ryujinx模拟器linux安装教学,switch模拟器Ryujinx
  12. 遭遇nat.exe,socks.exe,USP10.dll,BOSC.dll,kb080387.CNT,~ctwxw.txt等2
  13. html 酷狗音乐教程,仿酷狗html5手机音乐播放器主要部分代码_html5教程技巧
  14. 支持向量机之思维导图
  15. 可用性设计之过载保护
  16. mysql时区time_zone和sytem_time_zone
  17. 微软服务器2016各版本区别,Win10系统有几个版本?Windows10各版本区别详细介绍
  18. 前端如何对视频进行截屏加标注
  19. Halcon实例分析——check_blister.hdev
  20. 数据库load data命令批量插入txt文件的数据

热门文章

  1. silverlight寻奇 - Graphite
  2. 【Vue案例二】实现对表单数据的添加、删除以及关键字查询操作
  3. PCB设计--PCB画图技巧
  4. c++: size_type与 size_t一些概念
  5. Python的数据类型与结构
  6. 7-290 鸡兔同笼 (10 分)
  7. 储存字母 电子计算机,计算机基础_精简版
  8. 光机学院计算机系,计算机系召开第十二届科技节闭幕式
  9. 东华理工大学arm试卷_ARM东华理工大学2015-2016试卷A
  10. 牛客网数据库SQL实战答案解析上篇