# 9.7 权限控制 :::tip 概述 前端权限三层:**路由层**(菜单按角色过滤生成)、**指令层**(v-perm / v-perms 控制按钮)、**逻辑层**(usePermission 组合式函数供 v-if 使用)。超管通配码 `*:*:*` 全通过。 ::: ## 指令 ```html 添加案例演示 批量删除 ``` | 指令 | 语义 | 实现 | |---|---|---| | v-perm | 包含**其中任一**权限(some 判定) | directives/permission.ts → hasSomePermission | | v-perms | 包含**全部**权限(every 判定) | directives/permission.ts → hasEveryPermission | 判定基于 user store 的权限集合;命中通配码 `*:*:*` 直通(超管)。不满足时**移除 DOM 元素**(非隐藏)。 :::warning 入参必须是数组 `hasSomePermission` 对非数组入参按空权限处理(`Array.isArray(accesses) ? accesses : []`)——写成 `v-perm="'sys:user:add'"` 字符串形式会导致元素**一律被移除**。正确写法 `v-perm="['sys:user:add']"`。 ::: ## 组合式函数(usePermission) ```typescript const { hasPermission, hasSomePermission, hasEveryPermission } = usePermission(); // v-if 场景 v-if="hasPermission(['sys:user:add'])" ``` | 函数 | 语义 | |---|---| | hasPermission(accesses) | 包含任一(空数组视为通过) | | hasSomePermission(accesses) | 包含任一(string/array 归一) | | hasEveryPermission(accesses) | 包含全部 | ## 权限数据来源 ```text 登录后守卫 GetInfo → user store.getPermissions (后端 LoadIdentity 装配的权限节点集合,含菜单下发的节点码) ``` ## 安全边界提醒 前端权限**只是体验层**:隐藏按钮防误操作,越权请求仍会被后端 Authz 403 拦截。任何接口的安全性以 RouteSpec.Permission 为准,前端漏配指令不构成安全洞,但会造成用户困惑——两侧权限码保持一致是联调检查项(见 [3.9 权限节点配置](/zh/guide/permission.html))。 ## 常见问题 | 现象 | 检查 | |---|---| | 按钮不显示 | 菜单节点码与 v-perm 值是否一致;角色是否勾选该节点 | | 指令报错 | v-perm 需要字符串/数组,undefined 直接跳过 | | 改授权后不生效 | 重新登录(权限集合在登录后装配) | ## 相关 - [5.4 权限管理(RBAC)](/zh/core/rbac.html)