news 2026/5/29 15:11:22

Vue——接手一个权限混乱的后台,我只用了1小时让它变得可控

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue——接手一个权限混乱的后台,我只用了1小时让它变得可控

问题

几乎所有后台管理系统都会遇到权限控制的问题,典型的故障现场是这样的:

  1. 菜单显示不对:普通用户看到了管理员的菜单项
  2. 路由可以访问:直接在浏览器输入/admin/user就能进入管理页面
  3. 按钮权限失效:没有删除权限的用户也能看到删除按钮
  4. 刷新后权限丢失:F5刷新页面,动态路由消失,页面白屏
  5. 前后端权限不一致:前端隐藏了菜单,但接口没有校验,直接调用API仍能操作

这类问题的根本原因不是"权限逻辑写错了",而是权限控制的链路被拆散到了太多地方

  • 路由配置写在 router.js 里
  • 菜单渲染在 Sidebar 组件里
  • 按钮权限在各个页面的 v-if 里
  • 接口鉴权在后端 Controller 里
  • 用户信息存储在 Vuex/Pinia 里

当这些分散的逻辑没有统一协调时,任何一个环节出问题都会导致权限失控。

更麻烦的是,不同公司对权限的需求差异很大:

  • 有的公司只需要简单的角色控制(admin/editor/viewer)
  • 有的公司需要细粒度的按钮权限(user:add, user:edit, user:delete)
  • 有的公司需要数据权限(只能看本部门的数据)
  • 有的公司需要动态配置(运营人员可以在后台配置角色权限)

如果一开始没有设计好扩展性,后面每增加一种需求都要大改代码。


解决方案

解决权限问题的核心思路是:建立统一的权限控制体系,把路由、菜单、按钮、接口四层权限收束成单一入口。

这套体系需要明确规定:

  1. 谁能发起路由注册(前端智能模式 vs 后端全控模式)
  2. 谁能修改用户权限状态(只能通过登录/刷新接口)
  3. 谁负责串联权限校验流程(路由守卫统一处理)
  4. 谁决定失败时如何降级(重定向到403或首页)

一个真正可用的权限控制方案,至少应该统一这几件事:

1. 两种权限模式的切换

  • 前端智能模式(intelligence):前端维护完整路由表,根据用户角色过滤
  • 后端全控模式(all):后端返回用户可访问的路由配置,前端动态注册

2. 四层权限的统一校验

  • 路由级:路由守卫中校验是否有访问权限
  • 菜单级:根据权限动态渲染侧边栏菜单
  • 按钮级:自定义指令v-hasPermi控制按钮显示
  • 接口级:后端拦截器校验 Token 和权限标识

3. 权限数据的持久化

  • 登录后保存用户信息和权限列表到 Store
  • 刷新页面时从 localStorage 恢复权限状态
  • Token 过期时自动登出并清除权限

4. 异常情况的降级处理

  • 无权限访问时重定向到 403 页面
  • 路由不存在时重定向到 404 页面
  • Token 失效时重定向到登录页

如果用一句话概括它的本质,那就是:

权限控制不是在前端藏几个菜单,而是要建立从路由到接口的完整防护链。


具体实现

最小示例

下面先给一个最小但完整的 Demo。它展示了前端智能模式下,如何根据用户角色过滤路由并动态注册。

// router/index.tsimport{createRouter,createWebHistory}from'vue-router';// 常量路由(所有人可访问)exportconstconstantRoutes=[{path:'/login',component:()=>import('@/views/login.vue')},{path:'/',component:()=>import('@/views/dashboard.vue')},];// 异步路由(需要根据权限动态添加)exportconstasyncRoutes=[{path:'/system',component:()=>import('@/layout/index.vue'),meta:{roles:['admin']},children:[{path:'user',component:()=>import('@/views/system/user.vue')},{path:'role',component:()=>import('@/views/system/role.vue')},],},{path:'/editor',component:()=>import('@/layout/index.vue'),meta:{roles:['admin','editor']},children:[{path:'article',component:()=>import('@/views/editor/article.vue')},],},];constrouter=createRouter({history:createWebHistory(),routes:constantRoutes,});exportdefaultrouter;
// store/modules/permission.tsimport{defineStore}from'pinia';import{asyncRoutes,constantRoutes}from'@/router';// 判断用户是否有权限访问某个路由functionhasPermission(route:any,roles:string[]){if(route.meta&&route.meta.roles){returnroles.some(role=>route.meta.roles.includes(role));}returntrue;// 没有配置roles表示所有人可访问}// 递归过滤有权限的路由functionfilterAsyncRoutes(routes:any[],roles:string[]){constresult:any[]=[];routes.forEach(route=>{consttmp={...route};if(hasPermission(tmp,roles)){if(tmp.children){tmp.children=filterAsyncRoutes(tmp.children,roles);}result.push(tmp);}});returnresult;}exportconstusePermissionStore=defineStore('permission',{state:()=>({routes:[],addRoutes:[],}),actions:{generateRoutes(roles:string[]){returnnewPromise(resolve=>{letaccessedRoutes;// admin角色可以访问所有路由if(roles.includes('admin')){accessedRoutes=asyncRoutes||[];}else{accessedRoutes=filterAsyncRoutes(asyncRoutes,roles);}this.routes=constantRoutes.concat(accessedRoutes);this.addRoutes=accessedRoutes;resolve(accessedRoutes);});},},});
// permission.ts - 路由守卫importrouterfrom'./router';import{useUserStore}from'@/store/modules/user';import{usePermissionStore}from'@/store/modules/permission';importNProgressfrom'nprogress';constwhiteList=['/login'];// 白名单router.beforeEach(async(to,from,next)=>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 15:09:09

ControlNet预处理器技术架构深度解析:从图像理解到生成控制

ControlNet预处理器技术架构深度解析:从图像理解到生成控制 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux插件作为AI…

作者头像 李华
网站建设 2026/5/29 15:09:06

网页设计后端:第一周

1.配置环境并运行hello world2.编写九九乘法表并运行3.编写表单界面和表单信息接收界面4.项目目录如图

作者头像 李华
网站建设 2026/5/29 15:07:17

QINQ实验

实验需求PC5和PC6两个PC属于vlan10,网段为192.168.1.0/24PC7和PC8属于vlan20,网段为192.168.2.0/24PE使用qinq对内网vlan进行封装,外层vlan为100和200进行通信,分别使用基本qioq和扩展qion进行配置实验配置1、配置基本qioqCE1[CE1…

作者头像 李华
网站建设 2026/5/29 15:07:15

Go语言自然语言处理:文本生成与序列模型

Go语言自然语言处理:文本生成与序列模型 自然语言处理(NLP)是人工智能领域的重要分支,涉及理解和生成人类语言。本文将深入探讨如何使用Go语言实现文本生成模型和序列模型。一、序列模型概述 序列模型是处理序列数据的神经网络模型…

作者头像 李华
网站建设 2026/5/29 15:07:10

学龄前孩子爱模仿,做好榜样潜移默化引导行为习惯

学龄前的孩子就像一面镜子,他们不太听得懂大道理,却天生善于观察和模仿身边最亲近的人。父母说话的语气、对待他人的态度、收拾物品的习惯,甚至情绪表达的方式,都会在不知不觉中被孩子复制。与其反复用语言纠正,不如先…

作者头像 李华
网站建设 2026/5/29 15:05:16

pve或者运维 局域网网络问题排查

如果要区分真实网口 要在pve中的网络配置里面新增虚拟网口对应上真实网口。特别注意,网关配置在能连接公网的网口中,同时这个pve默认网关不会对局域网连接造成影响。196.254.xx.xx是自动配置的ipv4地址 大概率是网络根本没有连接到外部(内部直…

作者头像 李华