Skip to content

权限控制 ​

前端权限分两层:路由是否可进(菜单驱动),以及按钮/区域是否渲染(权限码)。最终鉴权在后端;前端只隐藏无权限入口。

权限数据从哪来 ​

useUserStore(store/modules/user.store.ts)持有:

  • token、userInfo、permissions: string[]、menus、routes、isRoutesInited
  • 登录 / getUserInfo 写入 permissions;含 * 视为全部放行

校验方法:

方法含义
hasPermission(code)单个码;空串视为 true;含 * 为 true
hasAnyPermission(list)任一满足
hasAllPermissions(list)全部满足

按钮指令 ​

admin/src/directives/perms.ts 注册:

指令关系说明
v-has-permOR满足任一权限码即可;别名 v-permission、v-perms
v-has-all-permAND须同时满足全部权限码

无权限时元素会从 DOM 移除(removeChild),不是 display:none。

vue
<el-button v-has-perm="'user.create'">新增</el-button>
<el-button v-has-all-perm="['user.edit', 'user.delete']">高危操作</el-button>

路由层 ​

createPermissionGuard(见「路由系统」)在登录后拉取菜单并 addRoute。无可用叶子菜单时 clearAuthInfo() 并跳转 /403。菜单项上的权限码进入路由 meta.perms,供 getRoutePath(perms) 等反查。

常量白名单页不校验登录态。业务页必须挂在动态菜单下,否则刷新后守卫不会注册对应组件。

基于 MIT 许可发布