Files
easygoadmin-wiki/EasyGoAdmin_Gin_NaiveVue/zh/guide/permission.md
T
2026-10-25 17:24:27 +08:00

73 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3.9 权限节点配置
:::tip 概述
接口侧的权限码在 RouteSpec 声明,但"谁能访问"由菜单-角色链路决定:菜单表登记权限节点,角色勾选授权,authz 中间件按元数据校验。本页说明新模块的权限接入步骤。
:::
## 权限判定链路
```text
RouteSpec.Permission(如 sys:example:page)
│ Bind 注册时落路由元数据表
▼
authz 中间件:解析当前用户 → 查角色授权的权限集合 → 命中即放行
│
▼
菜单表 gin_menu.permission 登记节点 → 角色管理勾选 → gin_role_menu 关联
```
注意:**RouteSpec 声明是校验依据,菜单登记是授权入口**——两处的权限码字符串必须一致。只配 RouteSpec 不配菜单,任何人都无法获得该接口权限;只配菜单不配 RouteSpec,接口实际处于"登录即可"状态。
## 菜单表关键字段
```text
gin_menu
├── name 菜单名称
├── parent_id 上级ID(目录/菜单树)
├── path 前端路由路径
├── component 前端组件路径(views 下的相对路径)
├── permission 权限节点(sys:example:page)
├── type 菜单类型:0-菜单 1-节点
├── target 打开方式:0-组件 1-内链 2-外链
├── status 状态:0-正常 1-停用
└── sort 排序
```
`type=1` 的"节点"类型专门承载纯权限点(不显示为菜单项),页面按钮级权限通常配成节点挂在页面菜单下。
## 新模块权限配置步骤
1. **目录**:菜单管理下为新模块建一个目录(或复用现有目录,生成器默认挂 `generator.parentMenuId` 指定的父级)
2. **菜单**:建页面菜单,`path` 与前端路由一致,`component` 指向 `ui/src/views` 下页面
3. **节点**:按 RouteSpec 中每个权限码建 `type=1` 节点,`permission` 逐字一致
4. **授权**:角色管理勾选新节点,保存(写入 gin_role_menu)
5. **验证**:用受限角色登录,页面可见、按钮按 `v-permission` 显隐、直连接口 403/放行符合预期
## 按钮级权限(前端)
前端用 `v-perm`(包含其一)/ `v-perms`(包含全部)指令按权限码控制按钮:
```html
<!-- ui/src/views/tool/example/index.vue 实际用法(注意:入参必须是数组) -->
<el-button type="primary" @click="handleAdd" v-perm="['sys:example:add']">添加案例演示</el-button>
<el-button type="danger" @click="handleDelete()" v-perm="['sys:example:batchDelete']">批量删除</el-button>
```
超管权限集合含通配码 `*:*:*`,指令判定直通。用户菜单接口(`/api/index/getMenus`)返回的菜单树已按角色过滤,节点权限码一并下发供前端比对。详见 [9.7 权限控制](/zh/frontend/permission.html)。
## 代码生成器代劳
生成器会按 RouteSpec 幂等创建菜单行(含页面菜单与权限节点),配置 `generator.parentMenuId` 指定挂载位置——手工开发时可以参照生成器的菜单行结构照抄。
## 常见问题
| 现象 | 原因 |
|---|---|
| 接口 403 | 角色未授权该权限码,或菜单 permission 与 RouteSpec 拼写不一致 |
| 接口通但页面按钮不显示 | 前端 v-perm 的码与菜单节点不一致 |
| 不配权限码接口却能访问 | RouteSpec.Permission 留空 = 登录即可,按需补声明 |
## 下一步
→ [3.10 前端联调指引](/zh/guide/frontend-integration.html)