权限控制
前端权限分两层:路由是否可进(菜单驱动),以及按钮/区域是否渲染(权限码)。最终鉴权在后端;前端只隐藏无权限入口。
权限数据从哪来
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-perm | OR | 满足任一权限码即可;别名 v-permission、v-perms |
v-has-all-perm | AND | 须同时满足全部权限码 |
无权限时元素会从 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) 等反查。
常量白名单页不校验登录态。业务页必须挂在动态菜单下,否则刷新后守卫不会注册对应组件。