Vue依赖注入实现多级权限校验状态共享,核心是通过Symbol键provide响应式权限对象及hasPermission方法,后代组件inject安全获取并响应式校验,配合路由守卫与后端二次校验确保安全。

Vue 依赖注入实现多级权限校验状态共享,核心是用 provide 在应用或布局层统一注入一个响应式权限对象,再由任意深层组件通过 inject 安全获取并校验——不靠 props 逐层传,也不依赖全局 store。
用 Symbol 键注入响应式权限对象
避免字符串 key 冲突,推荐用 Symbol 声明唯一注入标识:
- 定义
const PERMISSION_KEY = Symbol('permission') - 在根组件(如 App.vue)或权限布局组件中,用
provide(PERMISSION_KEY, reactive({ permissions: [], has: (key) => ... })) - 确保权限数据是
reactive或ref包裹的,否则后代组件无法响应式更新
封装可复用的权限校验逻辑
注入的对象不只是数据,更要包含校验能力:
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
-
hasPermission(key)方法内部比对当前权限列表(如字符串数组或位运算值) - 支持通配符,例如
user:*或order:edit粒度控制 - 方法本身也应是响应式上下文的一部分,避免闭包捕获过期状态
在任意组件中安全注入与使用
后代组件无需关心层级,直接 inject 即可:
立即学习“前端免费学习笔记(深入)”;
- 使用
const { hasPermission } = inject(PERMISSION_KEY)获取校验函数 - 模板中可用
v-if="hasPermission('user:delete')"控制按钮显隐 - 组合式函数中也可调用,比如在
onMounted里判断是否加载敏感数据 - 务必传入默认值或做空值防护,如
inject(PERMISSION_KEY, { permissions: [], has: () => false })
配合路由守卫与后端二次校验
前端注入的权限只是视图层优化,不能替代服务端控制:
- 路由元信息(
meta.requiresAuth)应与注入的权限对象联动,避免跳转到无权页面 - API 请求前,用
hasPermission判断是否发起,同时后端接口仍需做 RBAC 校验 - 权限变更时(如角色切换),触发注入对象的
permissions更新,整个组件树自动重渲染

















