vue router权限管理实现不同角色显示不同路由

实现权限管理需要以下步骤:

1. 安装Vue Router

npm install vue-router --save

2. 配置路由

router/index.js文件中,定义路由和对应的组件,并为每个路由定义一个meta字段,用于存放该路由需要的权限。

import Vue from 'vue'
import Router from 'vue-router'
import Home from '../views/Home.vue'
import Admin from '../views/Admin.vue'
import User from '../views/User.vue'

Vue.use(Router)

export const router = new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home,
      meta: {
        requiresAuth: false // 不需要权限的路由
      }
    },
    {
      path: '/admin',
      name: 'Admin',
      component: Admin,
      meta: {
        requiresAuth: true, // 需要登录后才能访问的路由
        requiresRole: 'admin' // 需要管理员角色才能访问的路由
      }
    },
    {
      path: '/user',
      name: 'User',
      component: User,
      meta: {
        requiresAuth: true, // 需要登录后才能访问的路由
        requiresRole: 'user' // 需要用户角色才能访问的路由
      }
    }
  ]
})

3. 添加路由守卫

router/index.js文件中,为每个需要权限控制的路由添加路由守卫,判断用户是否登录以及用户角色是否满足访问该路由的要求。如果不满足则跳转到登录页面或者提示无权限访问。同时,也要为不需要权限控制的路由添加路由守卫,防止已登录用户再次访问登录页面。

import { router } from './index'
import { getToken } from '../utils/auth'

const whiteList = ['/'] // 不需要权限的路由

router.beforeEach((to, from, next) => {
  const token = getToken()

  if (token) { // 已登录
    if (to.path === '/login') { // 防止已登录用户访问登录页面
      next({ path: '/' })
    } else {
      if (to.meta.requiresAuth) { // 需要权限控制
        const userRole = localStorage.getItem('userRole')
        if (to.meta.requiresRole === userRole) { // 用户角色满足要求
          next()
        } else { // 用户角色不符合要求
          next({ path: '/' }) // 提示无权限访问
        }
      } else { // 不需要权限控制
        next()
      }
    }
  } else { // 未登录
    if (whiteList.indexOf(to.path) !== -1) { // 不需要权限的路由,直接访问
      next()
    } else { // 需要权限的路由,跳转到登录页面
      next({ path: '/login' })
    }
  }
})

示例1:

比如,管理员角色需要访问后台管理页面,而普通用户不能访问。我们可以这样定义路由:

{
  path: '/admin',
  name: 'Admin',
  component: Admin,
  meta: {
    requiresAuth: true,
    requiresRole: 'admin'
  }
}

在路由守卫中,我们检查该路由是否需要权限控制,以及该用户的角色是否符合要求:

if (to.meta.requiresAuth) {
  const userRole = localStorage.getItem('userRole') // 从localStorage中获取用户角色
  if (to.meta.requiresRole === userRole) { // 用户角色满足要求
    next()
  } else { // 用户角色不符合要求
    next({ path: '/' })
  }
} else {
  next()
}

如果该路由需要权限控制,我们从localStorage中获取该用户的角色,并检查该角色是否等于路由要求的角色。如果不满足要求,则提示无权限访问。

示例2:

比如,未登录用户只能访问登录页面和注册页面,不能访问其他需要权限控制的页面。我们可以这样定义路由:

{
  path: '/login',
  name: 'login',
  component: Login,
  meta: {
    requiresAuth: false
  }
},
{
  path: '/register',
  name: 'register',
  component: Register,
  meta: {
    requiresAuth: false
  }
},
{
  path: '/profile',
  name: 'profile',
  component: Profile,
  meta: {
    requiresAuth: true
  }
}

在路由守卫中,我们为/login/register添加白名单,防止未登录用户访问其他页面:

const whiteList = ['/login', '/register']

if (whiteList.indexOf(to.path) !== -1) { // 不需要权限的路由,直接访问
  next()
} else { // 需要权限的路由,跳转到登录页面
  next({ path: '/login' })
}

如果用户访问的是白名单中的路由,我们直接允许访问。如果访问的是其他路由,则跳转到登录页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue router权限管理实现不同角色显示不同路由 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 学习Vue框架中必掌握的重点知识

    学习Vue框架中必掌握的重点知识 组件基础 Vue的组件是Vue应用的基本模块。组件是可复用的,Vue应用将一个页面划分为多个组件并组成组件树。组件是拥有自己的状态和生命周期的可复用模块。了解组件的定义、注册、渲染以及组件之间的通信是掌握Vue的关键。 组件的定义和注册 组件的定义是通过Vue.extend()和Vue.component()方法来实现的。V…

    Vue 2023年5月28日
    00
  • vue组件库的在线主题编辑器的实现思路

    让我来详细讲解一下“Vue组件库的在线主题编辑器的实现思路”的完整攻略。 简介 Vue组件库的在线主题编辑器可以让用户在浏览器中快速地在前端组件之间切换不同的主题,实现对组件样式的高效编辑和定制。实现思路主要分为以下几个步骤: 构建基于Vue的组件库 实现主题JSON文件的存储和读取 实现在浏览器中编辑主题的可视化交互界面 实现主题对组件的动态更换 下面我针…

    Vue 2023年5月28日
    00
  • vue项目首屏加载过慢的一些解决方案

    首屏加载慢是vue项目中常见的问题,以下是一些解决方案。 1. 代码分割 由于Vue的单页面应用,一旦一个组件被请求,整个应用程序将被加载到浏览器中。这就导致了首屏加载速度缓慢的问题。通过代码分割,将应用程序分解成更小的块,可以减少加载时间并改善用户体验。 Vue官方提供了vue/cli脚手架工具,其中webpack已经默认配置好了代码分割。通过动态导入组件…

    Vue 2023年5月29日
    00
  • vue3.x源码剖析之数据响应式的深入讲解

    Vue3.x源码剖析之数据响应式的深入讲解 简介 本文将深入讲解Vue3.x响应式原理,包含以下内容: 什么是响应式 Vue2.x的响应式实现 Vue3.x的响应式实现 Vue3.x的响应式能力扩展 什么是响应式 简单来说,响应式是指当某个数据发生变化时,相关的代码会自动触发更新,以保证用户界面与数据的同步。 在前端开发中,响应式是非常重要的概念。Vue就是…

    Vue 2023年5月28日
    00
  • Vue项目使用svg图标实践

    Vue项目使用SVG图标实践 本文主要介绍在Vue项目中如何使用SVG图标,并提供两个示例说明。 集成SVG图标 安装svg-sprite-loader svg-sprite-loader将svg文件打包成单个svg sprite,该svg sprite可以通过样式或相关API的方式在您的应用程序中使用。 npm install svg-sprite-loa…

    Vue 2023年5月27日
    00
  • vue在html标签{{}}中调用函数的方法总结及对比

    下面是详细讲解“vue在html标签{{}}中调用函数的方法总结及对比”的完整攻略。 问题描述 在vue中,我们可以使用{{}}这样的语法来渲染数据到HTML标签中。但是如果我们需要在渲染的时候执行一些函数,该怎么处理呢?比如,如果我们有一个计算方法,需要将结果插入到HTML标签中,应该怎么做呢? 解决方案 方法一:使用计算属性 在vue中,我们可以使用计算…

    Vue 2023年5月28日
    00
  • vue3 name 属性的使用技巧详解

    下面我将为您详细讲解“vue3 name 属性的使用技巧详解”的完整攻略。 什么是 Vue3 的 name 属性? 在 Vue3 中,每个组件都可以通过设置 name 属性来定义一个组件的名称。这个名称通常会被用于调试和错误信息中。 具体来说,如果需要调试一个组件或是在控制台中查看组件的类名,这时候就会用到 name 属性。另外,Vue3 还会在调试工具中使…

    Vue 2023年5月28日
    00
  • vue-router重写push方法,解决相同路径跳转报错问题

    在 Vue.js 路由中使用 router.push 方法进行路由导航时,如果跳转的路径和当前路径相同,则会直接报错。为了解决这个问题,我们可以重写 router.push 方法,使其能够处理相同路径跳转的情况。 重写 router.push 方法的具体步骤如下: 手动创建一个新的 push 方法 在新的 push 方法中判断跳转路径是否和当前路径相同 如果…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部