1.0.431.verify.sql 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. -- ============================================================================
  2. -- 1.0.431 verify:租户 A 的 UAT_FUNCTION_USER 必须精确持有 sysOrg:list。
  3. --
  4. -- 为什么不能沿用 1.0.386.verify.sql 的口径:
  5. -- 旧断言是 `JOIN SysRole r ON ... WHERE r.Code = 'UAT_FUNCTION_USER'
  6. -- AND m.Permission = 'sysOrg:list'` 然后 COUNT(*)——按 RoleCode 跨租户聚合。
  7. -- 同名角色在租户 A / B 各有一个(RoleId 838258976469061 / 838259499909189);
  8. -- 只要任一租户还留着这条绑定,COUNT 就 >0 判真。
  9. -- 实测结果:租户 A 的绑定已被 GrantRoleMenu 全量覆盖删除,而旧 verify 因租户 B
  10. -- 仍在而一直判 Success —— 跨租户假阳性,权限二次丢失全程无告警。
  11. --
  12. -- 新口径:全部断言绑定到精确的 TenantId / RoleId / MenuId,且校验绑定确实归属
  13. -- 租户 A,避免「错误 RoleId 恰好有该菜单」被误判成功。
  14. --
  15. -- 约定(AutoVersionUpdate.RunVerifyScriptIfExists,Core/Update/AutoVersionUpdate.cs:224):
  16. -- 每条语句取「首行首列」当布尔断言,必须为真;返回 0 行会得到 NULL 判假并中断启动。
  17. -- 故每条断言一律返回标量真值,且不使用 SET(SET 不返回行 → 必然判假)。
  18. --
  19. -- 环境容错:目标 RoleId 不存在的库(非 UAT 夹具库)上主脚本为空操作,
  20. -- 四条断言同步短路为真。注意短路条件是精确 RoleId 缺失,不是 RoleCode。
  21. -- ============================================================================
  22. -- 1) 角色存在,且确实属于租户 A(RoleId 存在但租户不符 → 判假,不放行)
  23. SELECT IF(
  24. (SELECT COUNT(*) FROM SysRole WHERE Id = 838258976469061) = 0,
  25. 1,
  26. (SELECT COUNT(*) FROM SysRole
  27. WHERE Id = 838258976469061
  28. AND TenantId = 838257186181189
  29. AND Code = 'UAT_FUNCTION_USER'
  30. AND Status = 1)
  31. ) AS ok_role_in_tenant_a;
  32. -- 2) 菜单存在,且确实是 sysOrg:list 按钮(Type=3 Btn / 启用)
  33. SELECT IF(
  34. (SELECT COUNT(*) FROM SysRole WHERE Id = 838258976469061) = 0,
  35. 1,
  36. (SELECT COUNT(*) FROM SysMenu
  37. WHERE Id = 1300200030201
  38. AND Permission = 'sysOrg:list'
  39. AND Type = 3
  40. AND Status = 1)
  41. ) AS ok_menu_is_sysorg_list;
  42. -- 3) 租户 A 的 SysTenantMenu 允许该菜单(GetOwnBtnPermList 会 InnerJoin 它)
  43. SELECT IF(
  44. (SELECT COUNT(*) FROM SysRole WHERE Id = 838258976469061) = 0,
  45. 1,
  46. (SELECT COUNT(*) FROM SysTenantMenu
  47. WHERE TenantId = 838257186181189
  48. AND MenuId = 1300200030201)
  49. ) AS ok_tenant_a_allows_menu;
  50. -- 4) SysRoleMenu 精确存在 1 条(既非缺失也非重复),且该绑定归属租户 A
  51. SELECT IF(
  52. (SELECT COUNT(*) FROM SysRole WHERE Id = 838258976469061) = 0,
  53. 1,
  54. (SELECT COUNT(*) = 1
  55. FROM SysRoleMenu rm
  56. JOIN SysRole r ON r.Id = rm.RoleId
  57. JOIN SysMenu m ON m.Id = rm.MenuId
  58. WHERE rm.RoleId = 838258976469061
  59. AND rm.MenuId = 1300200030201
  60. AND r.TenantId = 838257186181189
  61. AND m.Permission = 'sysOrg:list')
  62. ) AS ok_rolemenu_exactly_one_in_tenant_a;