1.0.433.verify.sql 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. -- ============================================================================
  2. -- 1.0.433 verify:S5 冷链入站六个管理接口必须已登记权限,且未扩散到业务角色。
  3. --
  4. -- 约定(AutoVersionUpdate.RunVerifyScriptIfExists):
  5. -- 每条语句取「首行首列」当布尔断言,必须为真;返回 0 行会得到 NULL 判假并中断启动。
  6. -- 故每条断言一律返回标量真值,且不使用 SET(SET 不返回行 → 必然判假)。
  7. --
  8. -- 断言口径:全部钉死到精确 Permission / 精确 TenantId / 精确 RoleId,
  9. -- 不使用「RoleCode JOIN 后跨租户 COUNT」这种会产生跨租户假阳性的写法
  10. -- (该缺陷见 1.0.386.verify.sql,已由 1.0.431.verify.sql 纠正)。
  11. --
  12. -- 环境容错:非本项目夹具库(查不到 AIDOP 租户 / 库存查询菜单)上主脚本为空操作,
  13. -- 断言同步短路为真。
  14. -- ============================================================================
  15. -- 1) 六个权限点全部登记,且 Type=3 / Status=1
  16. SELECT IF(
  17. (SELECT COUNT(*) FROM SysMenu WHERE Name = 'aidopS5InventoryStockQuery' AND Type = 2) = 0,
  18. 1,
  19. (SELECT COUNT(*) = 6 FROM SysMenu
  20. WHERE Type = 3 AND Status = 1
  21. AND Permission IN (
  22. 's5InventoryInbound:bootstrap',
  23. 's5InventoryInbound:run-once',
  24. 's5InventoryInbound:reconcile',
  25. 's5InventoryInbound:transform-std',
  26. 's5InventoryInbound:transform-inventory-std',
  27. 's5InventoryInbound:daily-recon'))
  28. ) AS ok_six_permissions_registered;
  29. -- 2) 无重复登记(同一 Permission 只允许一条 Type=3)
  30. SELECT IF(
  31. (SELECT COUNT(*) FROM (
  32. SELECT Permission FROM SysMenu
  33. WHERE Type = 3
  34. AND Permission LIKE 's5InventoryInbound:%'
  35. GROUP BY Permission HAVING COUNT(*) > 1
  36. ) dup) = 0,
  37. 1, 0
  38. ) AS ok_no_duplicate_permission;
  39. -- 3) 挂载点正确:六个权限点都挂在「库存查询」页面菜单下
  40. SELECT IF(
  41. (SELECT COUNT(*) FROM SysMenu WHERE Name = 'aidopS5InventoryStockQuery' AND Type = 2) = 0,
  42. 1,
  43. (SELECT COUNT(*) = 6 FROM SysMenu m
  44. WHERE m.Type = 3
  45. AND m.Permission LIKE 's5InventoryInbound:%'
  46. AND m.Pid = (SELECT Id FROM SysMenu WHERE Name = 'aidopS5InventoryStockQuery' AND Type = 2 LIMIT 1))
  47. ) AS ok_mounted_under_stock_query;
  48. -- 4) 管理租户(AIDOP,拥有 AccountType=888 且无角色的 AIDopAdmin)已获得全部六条租户级授权
  49. SELECT IF(
  50. (SELECT COUNT(*) FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
  51. WHERE o.Code = 'AIDOP' AND t.Status = 1) = 0,
  52. 1,
  53. (SELECT COUNT(*) = 6
  54. FROM SysTenantMenu tm
  55. JOIN SysMenu m ON m.Id = tm.MenuId
  56. WHERE tm.TenantId = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
  57. WHERE o.Code = 'AIDOP' AND t.Status = 1 LIMIT 1)
  58. AND m.Type = 3
  59. AND m.Permission LIKE 's5InventoryInbound:%')
  60. ) AS ok_admin_tenant_granted;
  61. -- 5) UAT 租户(全部账号 AccountType=777)**不得**获得租户级授权
  62. SELECT IF(
  63. (SELECT COUNT(*) FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
  64. WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1) = 0,
  65. 1,
  66. (SELECT COUNT(*) = 0
  67. FROM SysTenantMenu tm
  68. JOIN SysMenu m ON m.Id = tm.MenuId
  69. WHERE tm.TenantId = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
  70. WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1)
  71. AND m.Type = 3
  72. AND m.Permission LIKE 's5InventoryInbound:%')
  73. ) AS ok_uat_tenant_not_granted;
  74. -- 6) UAT_FUNCTION_USER(精确 RoleId 838258976469061,租户 838257186181189)无任何该权限
  75. SELECT IF(
  76. (SELECT COUNT(*) FROM SysRole
  77. WHERE Id = 838258976469061 AND TenantId = 838257186181189) = 0,
  78. 1,
  79. (SELECT COUNT(*) = 0
  80. FROM SysRoleMenu rm
  81. JOIN SysMenu m ON m.Id = rm.MenuId
  82. WHERE rm.RoleId = 838258976469061
  83. AND m.Type = 3
  84. AND m.Permission LIKE 's5InventoryInbound:%')
  85. ) AS ok_uat_function_user_has_none;
  86. -- 7) 权限未扩散到**任何**角色(本批刻意不做 SysRoleMenu 授权)
  87. SELECT (
  88. SELECT COUNT(*) = 0
  89. FROM SysRoleMenu rm
  90. JOIN SysMenu m ON m.Id = rm.MenuId
  91. WHERE m.Type = 3 AND m.Permission LIKE 's5InventoryInbound:%'
  92. ) AS ok_no_role_holds_permission;