vue2/vue3路由权限管理的方法实例

作者:想要飞翔的猪 时间:2024-05-29 22:28:54 

1. Vue 路由权限控制一般有2种方法

a、路由元信息(meta)
b、动态加载菜单和路由(addRoutes)

2 路由元信息(meta)来进行路由权限控制

2.1 在vue2种的实现

如果一个网站有不同的角色,比如 管理员 和 普通用户 ,要求不同的角色能访问的页面是不一样的

这个时候我们就可以 把所有的页面都放在路由表里 ,只要 在访问的时候判断一下角色权限 。如果有权限就让访问,没有权限的话就拒绝访问,跳转到404页面

vue-router 在构建路由时提供了元信息 meta 配置接口,我们可以在元信息中添加路由对应的权限,然后在路由守卫中检查相关权限,控制其路由跳转。

可以在每一个路由的 meta 属性里,将能访问该路由的角色添加到 roles 里。用户每次登陆后,将用户的角色返回。然后在访问页面时,把路由的 meta 属性和用户的角色进行对比,如果用户的角色在路由的 roles 里,那就是能访问,如果不在就拒绝访问。

以下是vue2的实现方式:


import VueRouter from 'vue-router';
Vue.use(VueRouter)
...
routes: [
 {
   path: '/login',
   name: 'login',
   meta: {
     roles: ['admin', 'user']
   },
   component: () => import('../components/Login.vue')
 },
 {
   path: 'home',
   name: 'home',
   meta: {
     roles: ['admin']
   },
   component: () => import('../views/Home.vue')
 },
]

const router = new VueRouter({
 routes
})

export default router

在app.vue文件下引入,注册全局的路由守卫


//假设有两种角色:admin 和 user
//从后台获取的用户角色
const role = 'user'
//当进入一个页面是会触发导航守卫 router.beforeEach 事件
router.beforeEach((to,from,next)=>{
 if(to.meta.roles.includes(role)){
  next() //放行
 }esle{
  next({path:"/404"}) //跳到404页面
 }
})

自此基本上路由的权限控制就完成了

题外话 在路由守卫中也能很好的解决匹配不到路由转404页面的业务需求,实现如下:


import router from ‘./router‘
router.beforeEach((to, from, next) => {
  // ...
   if (to.matched.length === 0) {
       next('/404')
   } else {
       next()
   }
   //console.log(to, from, next, '路由守卫')
})

2.2 在vue3种的实现

其实思路都是差不多的,只是要注意的是vue3中使用路由的方式和vue2有一些细微的差异,使用我用更简单的404去创建vue3的实例,关于vue3的路由权限控制可以按vue2和下面代码依葫芦画瓢,实现代码如下:

创建路由:


import { createRouter, createWebHashHistory } from 'vue-router';
...
routes: [
 {
   path: '/login',
   name: 'login',
   meta: {
     roles: ['admin', 'user']
   },
   component: () => import('../components/Login.vue')
 },
 {
   path: 'home',
   name: 'home',
   meta: {
     roles: ['admin']
   },
   component: () => import('../views/Home.vue')
 },
]
const router = createRouter({
   history: createWebHashHistory(),
   routes: routers
})
export default router;

路由守卫(在App.vue里面进行全局注册):


import {
   useRouter
} from 'vue-router';
export default {
   name: 'App',
   setup() {
       const router = useRouter();
       router.beforeEach((to, from, next) => {
           // ...
           if (to.matched.length === 0) {
               next('/404')
           } else {
               next()
           }
       })
   }
}

4 . 动态加载菜单和路由(addRoutes)

根据用户权限或者是用户属性去动态的添加菜单和路由表,可以实现对用户的功能进行定制,vue-router 提供了 addRoutes() 方法,可以动态注册路由, 需要注意的是,动态添加路由是在路由表中 push 路由,由于路由是按顺序匹配的,因此需要将诸如404页面这样的路由放在动态添加的最后

5.总结

不管是vue2还是vue3,其实实现思想都差不多,只是使用接口细节会有少许的不一样,使用对我们来说学习的重点千万不能放在某一个框架上,而是要训练自己的思维

来源:https://juejin.cn/post/6973528614004342820

标签:vue,路由,权限
0
投稿

猜你喜欢

  • mysql主从库不同步问题解决方法

    2024-01-26 03:57:19
  • MySQL数据库的授权原则

    2008-12-29 13:39:00
  • 浅谈vue单一组件下动态修改数据时的全部重渲染

    2024-04-27 15:51:55
  • php设计模式 Singleton(单例模式)

    2023-11-20 14:37:50
  • wiondws XP下安装MySQL图文教程

    2007-06-15 09:29:00
  • numpy创建单位矩阵和对角矩阵的实例

    2023-08-05 10:25:44
  • CODEPAGE=936是什么意思?

    2009-07-05 18:37:00
  • 20分钟MySQL基础入门

    2024-01-22 21:37:54
  • Python 通过调用接口获取公交信息的实例

    2023-06-17 21:16:46
  • PHP设计模式之解释器模式浅析

    2023-05-29 02:28:16
  • Python实现Word文档转换Markdown的示例

    2022-06-24 08:23:29
  • javascript十个最常用的自定义函数(中文版)

    2024-04-16 09:26:38
  • php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)

    2024-05-22 10:07:10
  • CentOS7安装MySQL 8.0.26的过程

    2024-01-20 08:28:01
  • Python双链表原理与实现方法详解

    2023-10-10 20:55:40
  • 分组后分组合计以及总计SQL语句(稍微整理了一下)

    2024-01-26 23:10:51
  • oracle 字符串转成行

    2024-01-26 01:30:13
  • Python字符串格式化的方法(两种)

    2023-08-28 17:13:10
  • Javascript: 为<input>设置readOnly属性问题,希望大家以后要小心

    2009-07-23 20:24:00
  • 详解python中的json和字典dict

    2023-05-16 02:25:26
  • asp之家 网络编程 m.aspxhome.com