基于VUE实现前端动态路由权限控制

article/2025/9/18 1:52:59

需求

最近在项目中遇到权限控制的问题,由于自己接触前端也不久,对于路由这方面知识还有所欠缺,因此一直在网上找寻各种解决方案。最终还是看到花裤衩大佬的博客,终于对前端实现路由权限控制有了些许思路。
传送门:手摸手,带你用vue撸后台

下面这篇博客也有所参考:基于Vue实现后台系统权限控制

先说说我在项目中需要实现的效果:
由超级管理员在页面中进行选择,从而控制其他用户访问各页面的权限。系统再根据该用户所拥有的的权限来进行路由控制(对路由进行过滤)。

基本思路

1、创建vue实例的时将vue-router挂载,但vue-router初始时只挂载登录页面(或是其他不需要权限的页面)。

2、当用户登录后,获取后台返回的该用户能访问的页面数组role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表。

3、调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由。

4、使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件。

在我的项目中将后台返回的数组role定义为该用户可访问的页面,而不是该用户的职位(身份),因为在此系统中可以由超级管理员随意编辑用户所能访问的页面范围,而不仅仅是通过身份来定义权限。

具体实现

1、在router.js中将需要权限的每个页面的路由(异步挂载的路由asyncRouterMap)添加属于该页面的标签。(用于与role数组作比较)

import Vue from 'vue'
import Router from 'vue-router'Vue.use(Router)
import Layout from '../views/layout/Layout'export const constantRouterMap = [{ path: '/login',component: () => import('@/views/login/index'),hidden: true,meta: { title: '系统登录' },{path: '/',redirect: '/login'}
]export default new Router({// mode: 'history', //后端支持可开scrollBehavior: () => ({ y: 0 }),routes: constantRouterMap
})// 异步挂载的路由
// 动态需要根据权限加载的路由表
export const asyncRouterMap = [{path: '/home',component: Layout,children: [{path: 'index',name: 'home',component: () => import('@/views/home/index'),meta: { title: '首  页',icon: 'home',role: ['home', 'admin']}}]},{path: '/schedule',component: Layout,name: 'schedule',children: [{path: 'ongoing',name: 'ongoing',component: () => import('@/views/schedule/ongoing'),meta: { title: '工作进度', icon: 'ongoing',role: ['ongoing', 'admin']}}]},{path: '/schedule',component: Layout,name: 'schedule',children: [{path: 'follow_up',name: 'follow_up',component: () => import('@/views/schedule/follow_up'),meta: { title: '后续事务', icon: 'tree',role: ['follow', 'admin']}}]},{path: '/data_manage',component: Layout,name: 'data_manage',children: [{path: 'data_collect',name: 'data_collect',component: () => import('@/views/data_package/gather'),meta: { title: '数据包收集', icon: 'data_gather', role: ['data_collect', 'admin']}}]},{path: '/data_manage',component: Layout,name: 'data_manage',children: [{path: 'data_query',name: 'data_query',component: () => import('@/views/data_package/search_output'),meta: { title: '查询与导出', icon: 'output', role: ['search', 'output', 'admin']}}]},{path: '/template_manage',component: Layout,children: [{path: 'index',name: 'template_manage',component: () => import('@/views/document/index'),meta: { title: '文件管理', icon: 'document', requireAuth: true,role: ['admin', 'document'] }}]},{path: '/user_manage',component: Layout,children: [{path: 'index',component: () => import('@/views/user_manage/index'),name: '用户管理',meta: { title: '用户管理', icon: 'user_manage', role: ['admin'] } // 页面需要的权限}]},{ path: '*', redirect: '/404', hidden: true }
]

通过meta标签来标示该页面能访问的权限有哪些。如meta: { role: [‘admin’,‘home’] }表示该页面只有admin和拥有home页面进入权限的用户才能有资格进入。

注意事项:这里有一个需要非常注意的地方就是 404 页面一定要最后加载,如果放在constantRouterMap一同声明了404,后面的所以页面都会被拦截到404。

2、当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由,生成最终用户可访问的路由表。路由表存在vuex里面

\permission.js

import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
import { Message } from 'element-ui'
import { getToken } from '@/utils/auth' // 验权const whiteList = ['/login', '/'] // 不重定向白名单
router.beforeEach((to, from, next) => {NProgress.start()if (sessionStorage.getItem('name') !== null) {if (!store.getters.routers) {const permission = sessionStorage.getItem('role')store.dispatch('GenerateRoutes', { permission }).then(() => { // 生成可访问的路由表router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record})} else {next()NProgress.done()}} else {if (whiteList.indexOf(to.path) !== -1) {next()} else {next({path: '/login'})}}router.afterEach(() => {console.log('跳转成功')NProgress.done() // 结束Progress
})

\store\modules\permission.js

import { asyncRouterMap, constantRouterMap } from '../../router/index'function hasPermission(roles, route) {if (route.meta && route.meta.role) {return roles.some(role => route.meta.role.indexOf(role) >= 0)} else {return true}
}const permission = {state: {routers: constantRouterMap,addRouters: []},mutations: {SET_ROUTERS: (state, routers) => {state.addRouters = routersstate.routers = constantRouterMap.concat(routers)}},actions: {GenerateRoutes({ commit }, data) {return new Promise(resolve => {const { permission } = dataconst permissions = permission.split(',')const accessedRouters = asyncRouterMap.filter(v => {if (permissions.indexOf('admin') >= 0) return trueif (hasPermission(permissions, v)) {if (v.children && v.children.length > 0) {v.children = v.children.filter(child => {if (hasPermission(permissions, child)) {return child}return false})if (v.children.length === 0) { // 当children数组为空,即数组中的路由无权限被过滤掉return false} else {return v}} else {return false}}return false})commit('SET_ROUTERS', accessedRouters)resolve()})}}
}export default permission

3、使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件(菜单)。
在这里插入图片描述

4、前端控制用户权限页面

权限控制已经实现,只需要再实现用于超级管理员编辑用户权限的页面即可。
在这里插入图片描述

后续

现在看起来好像实现起来一点都不复杂,但是鬼晓得我当时实现花了多久。有时候改着改着代码,页面就一片空白,把我给拒之页外(哭泣),然后又开始一步一步调试查看被堵在哪里。
往事不堪回首,总归算是有了一点点进步,继续努力吧!!!


http://chatgpt.dhexx.cn/article/MRhHMjMf.shtml

相关文章

【Vue路由(router)进一步详解】

Vue路由(router)进一步详解 query属性具体实例代码如下: params属性具体实例代码如下: props属性replace属性编程式路由导航路由缓存具体代码: 总结 本篇文章主要针对已经掌握Vue路由(router)基…

vue 实现动态路由

1、什么是动态路由? 2、动态路由的好处 3、动态路由如何实现 1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现及页面的渲染。动态的路由存储可分…

16-Vue3 动态路由权限控制

Vite2Vue3TypeScriptElement-plus脚手架搭建系列 ✅01-初始化 Vite 项目 ✅02-配置 Vite2 环境变量 ✅03-Vite2 配置及说明 ✅04-Vue3 使用 SCSS ✅05-Vue3 路由配置 ✅06-TypeScript 配置及说明 ✅07-Vue3 使用 axios ✅08-Vue3 axios 对象封装 ✅09-ESLint 配置及说明 ✅10-…

【Vue路由守卫】

Vue路由守卫 Vue路由守卫全局路由守卫全局前置守卫全局后置守卫实例代码: 独享守卫组件内守卫总结 Vue路由守卫 路由守卫,简单理解来说就是,当用户要进行一些操作时,我需要用户的一些信息或数据或行为,我判断过后&…

vue 动态路由实现 后端控制权限时的前端处理

前端思路: 上图中 获取路由信息 ,可以是后端控制的,可以是前端根据用户信息从路由表中筛选的。 此处只讲解后端存储路由信息的情况 组织路由信息 请求后台,获取返回结果,结果有两种可能,一种是组合好的…

vue-router路由权限控制的两种实现方案

前言 最近在抽时间写一套后台管理系统框架模板(vueelement-ui),记录一些问题的解决方案。文章没什么顺序,就想到什么写什么了,也都是之前工作上碰到的问题。 抛出问题 Vue项目路由权限控制怎么实现? 实现…

Vue路由

目录 一、路由的概念 二、事前准备 三、 路由的相关知识点 3.1 路由的基本认识 3.2 路由小案例 3.3 路由模式的切换 3.4 指定路由的渲染位置 3.5 声明式导航 3.5.1 无参模式 3.5.2 传参模式 3.5.3 $route 与$router的区别 3.6 编程式导航 3.6.1 第一种get方…

Vue动态路由使用(后端控制)

使用VUE开发后台管理系统 完全由后端控制左边菜单项思路 在传统开发后台管理系统时,都会涉及权限控制这一功能需求 即:根据不同登录的角色账号来使用该账号拥有的功能,也就是说系统左边的菜单栏不是固定不变的,而是根据登录账号的…

Vue学习:路由

2. 路由 2.1 前端路由的发展历程 2.1.1 认识前端路由 路由其实是网络工程中的一个术语: 在架构一个网络时,非常重要的两个设备就是路由器和交换机。 ​ 当然,目前在我们生活中路由器也是越来越被大家所熟知,因为我们生活中都…

vue权限控制和动态路由

思路 登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到localStore中,保证刷新页面后能记住用户登录状态)&#xf…

Vue 路由权限控制

当我们在做后台管理系统的时候,都会涉及到系统左侧的菜单树如何动态显示的问题。目前基本上都是RBAC的解决方案,即Role-Based Access Control,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了…

【Git CMD】Git常用命令总结

目录 0 git的工作区、暂存区、本地仓库和远程仓库0.1 图解0.2 解析 1 本地仓库1.1 创建版本库1.2 分支1.2.1 查看本地仓库的分支信息1.2.2 创建分支1.2.3 切换分支1.2.4 重命名分支1.2.5 合并分支1.2.6 删除分支 1.3 添加文件到暂存区1.3.1 添加单个文件1.3.2 添加多个文件1.3.…

Git常用命令大全(从入门到使用,学不会评论区骂我)

Git常用命令大全 1:Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。在Git 命令行中执行下面命令: 设置用户信息 git config --global user.name “你的用户名” …

Git常用命令及方法大全

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库 本地分支关联远程:git branch --set-upstre…

Git 常用命令大全

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin git192.168.1.119:ndshowgit push origin …

Git常用命令大全

Git常用命令大全 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库 本地分支关联远程 git branch --set-u…

git常用命令总结

1 git概述 1.1 简介 git是分布式版本控制系统(Distributed Version Control System,简称DVCS),分为两种仓库 :本地仓库和远程仓库。 本地仓库:是在开发人员自己电脑上的Git仓库远程仓库:是在…

20 个最常用的 Git 命令用法说明及示例

在这篇文章中,我将介绍在使用 Git 时最常使用的 20 个命令。 作者 | Sahiti Kappagantula 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: 以下是这些Git命令: git config git…

Git基本命令大全

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 1、git clone -b <指定分支名> <远程仓库地址> 克隆指定分支 如&#xff1a; git clone -b bestore_master ssh://gitgit-ssh.xxx.com/xxx.git 2、 git bra…

常用git命令总结大全

目录 一、常用命令 1、git init 2、git add 文件名 3、git commit -m “备注” 4、git status 与 git diff 5、git show commit_id 查看某次修改 6、git log 与 git reflow 7、git pull (--rebase) 8、git push (-u) 与 git branch (-u) 9、git reset --hard 与 git…