2.4 KiB
2.4 KiB
验收矩阵(菜单 × 按钮 × 接口)
目标:验证“菜单可见性(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\ncontests/:id:需contest:read或activity:read\nanalytics/overview:需contest:read\nactivities/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