3.8 权限节点配置
概述
本项目权限校验的声明在接口 gmeta 标签,落地在菜单表的权限节点(menu.type=1)。新增模块后需要确保:权限码规范正确 → 节点存在 → 角色已勾选。超管(ROLE_SUPER_ADMIN)绕过全部校验。
权限码规范
text
sys:{模块小驼峰}:{动作}
动作与方法名一致:page / list / detail / add / update / delete / batchDelete
/ status / import / export / resetPwd / execute / pause / resume
/ savePermission / getPermission / cache / users / save …
特例:配置网站 sys:configWeb:data|save
生成器 sys:generator:generator|batchGenerator
上传 sys:upload:file|filesexample 模块的权限码(gmeta 声明,摘自 api/v1/example.go):
go
permission:"sys:example:page" // Page
permission:"sys:example:list" // List
permission:"sys:example:detail" // Detail
permission:"sys:example:add" // Add
permission:"sys:example:update" // Update
permission:"sys:example:status" // Status
permission:"sys:example:delete" // Delete
permission:"sys:example:batchDelete" // BatchDelete
permission:"sys:example:import" // Import
permission:"sys:example:export" // Export权限判定链路
text
请求 → Bind 包装层 → consts.HasPerm(ctx, "sys:example:page")
├─ permission 标签为空 → 通过(仅登录即可)
├─ Roles 含 ROLE_SUPER_ADMIN → 通过(超管全放行)
├─ Perms 精确匹配 → 通过
└─ 否则 → code=403 信封Perms 来自身份缓存(easygoadmin:user:identity:{uid},TTL 300s):user → user_role → role_menu → menu 中 type=1 且 status=0 且 hide=0 的 permission 非空去重集合。
节点创建(两条途径)
途径一:代码生成器自动创建(推荐)
生成器 createMenu 副作用自动完成(幂等):
text
主菜单:parent_id = generator.parentMenuId(默认 189)
path = /{domain}/{moduleCamel},type=0,按 path 查重已存在则跳过
权限节点(type=1,挂主菜单下):
固定 7 个:page/list/detail/add/update/delete/batchDelete
HasStatus 追加 :status;HasImport/HasExport 追加 :import/:export途径二:菜单管理页面手工创建
「系统管理 → 菜单管理」新增:
| 字段 | 值(example 为例) |
|---|---|
| 上级菜单 | 选择模块主菜单 |
| 菜单类型 | 权限节点 |
| 权限标识 | sys:example:page |
| 名称 | 查询分页记录 |
| 状态 | 正常 |
角色勾选(生效前提)
节点创建后,必须在「系统管理 → 角色管理 → 权限」为角色勾选,保存走:
text
POST /api/role/menu/save (sys:role:savePermission)
→ 重写 role_menu 关联
→ 清理该角色全部用户的身份缓存(user:identity:{uid})超管不需要勾选(通配放行);前端识别 getUser 返回的 *:*:* 通配权限放开全部按钮。
开发自检清单
- [ ] gmeta
permission标签已按sys:{module小驼峰}:{action}声明 - [ ] 权限节点已在菜单存在(生成器自动 / 手工创建)
- [ ] 测试角色已勾选新节点并重新登录(或等 300s 缓存过期)
- [ ] 前端按钮用权限指令控制(见 9.7 权限控制)
- [ ] 免登录接口的
public:"true"与middleware/public.go白名单一致