library-picturebook-activity/docs/migration/verify-matrix.md

55 lines
2.4 KiB
Markdown
Raw Normal View History

2026-04-01 19:30:33 +08:00
# 验收矩阵(菜单 × 按钮 × 接口)
目标验证“菜单可见性role_menu”“按钮显示v-permission”“接口鉴权@PreAuthorize”三者一致且多租户不串台。
## 预置条件
- 执行 Flyway 迁移:`V32__rbac_align_all_tenants.sql`、`V33__rbac_permission_code_aliases_and_menu_fix.sql`
- 确认每个租户至少存在角色:`tenant_admin`(以及按需:`school_admin/teacher/student/judge`
- 给测试用户绑定目标租户与角色(`t_auth_user_role`
## 用例
### A. 菜单可见性GET /api/menus/user-menus
- **tenant_admin**:登录后菜单应非空;不应出现“只剩空白页面/无菜单”。\n
- **school_admin/teacher/student/judge**:登录后菜单与 tenant_id=1 模板一致(允许租户裁剪)。\n
- **租户隔离**:同一 userId 若历史绑定了其他租户角色,仍只返回当前 token 的 tenantId 对应角色菜单。\n
### B. 路由访问(路由 meta.permissions
抽查以下路由(以实际菜单为准):\n
- `contests/create`:需 `contest:create`\n
- `contests/:id`:需 `contest:read``activity:read`\n
- `analytics/overview`:需 `contest:read`\n
- `activities/review/:id`:需 `review:score`(兼容 `contest:review:score`\n
期望:\n
- **有权限**:可进入页面\n
- **无权限**:跳转到 `403`\n
### C. 按钮显示v-permission
抽查页面:\n
- 活动列表:`contest:create`、`contest:update`、`contest:delete`、`contest:publish`\n
- 评委管理:`judge:create/read/update/delete`\n
- 公告管理:`notice:create/update/delete`\n
- 系统管理:`role:*`、`menu:*`、`dict:*`、`config:*`、`tenant:*`(平台超管)\n
期望:\n
- **有权限**:按钮可见且可用\n
- **无权限**:按钮不可见(或禁用,按业务约定)\n
### D. 接口鉴权(后端 @PreAuthorize
抽查接口:\n
- 公告:`POST/PUT/DELETE /api/contests/notices...` 需 `notice:*`(兼容 `contest:notice:*`\n
- 评委:`POST/PUT/DELETE /api/contests/judges...` 需 `judge:*`(兼容 `contest:judge:*`\n
- 评分:`POST /api/contests/reviews/score` 需 `review:score`(兼容 `contest:review:score`\n
期望:\n
- **有权限**200\n
- **无权限**403\n
## 常用排查
- 执行只读审计:`docs/migration/rbac-audit.sql`\n
- 角色无菜单授权role_menu 为空)\n
- 菜单 permission 在租户权限表缺失\n
- 角色有菜单但缺少对应 permission 绑定\n