spec.md 2.1 KB

Harden Multi-Tenant Isolation

status: done

背景

当前租户隔离存在几类风险:

  • 部分 sys_ 业务表缺少 tenant_id 或被误放入租户忽略表,导致租户数据无法被 SQL 拦截器稳定隔离。
  • 流程、文件、公告关系等业务数据应随租户隔离,但旧表结构没有统一补齐。
  • sys_resource、页面模板、区域码等平台定义数据不适合按租户复制,需要通过角色授权或未来租户资源包控制可见性。
  • 数据权限在用户没有组织或范围为空时必须失败关闭,不能退化成全量查询。

设计原则

  1. 租户业务数据表必须包含 tenant_id,并从 ignoreTables 中移除。
  2. 平台定义表保持全局,不按当前租户 SQL 隔离,但管理端操作需要服务端权限兜底。
  3. sys_resource 作为全局菜单/权限定义,租户内实际可见菜单由 sys_role_resource.tenant_id 控制。
  4. 历史 tenant_id IS NULLtenant_id = 0 数据统一回填到默认租户 1
  5. 无组织、无自定义范围、无行政区划等数据权限空范围必须拼接恒假条件。

本阶段范围

  • 收敛租户忽略表默认配置。
  • 为流程、文件、公告关系表补齐 tenant_id 迁移。
  • 补齐对应 Java 实体字段。
  • 强化关键联表查询的同租户关联。
  • 将全局 AI 页面模板显式列为平台定义表,并限制模板维护只能由超级管理员执行。

后续阶段

  • 继续审查 sys_job_*sys_excel_*sys_file_storage_config 等平台配置表的管理权限。
  • 设计可选的 sys_tenant_resource 或租户资源包表,用于控制租户启用模块,而不是复制 sys_resource
  • 增加租户隔离回归用例:普通租户、租户管理员、超级管理员、无组织用户、多租户用户切换。

归档记录(HARD-GATE)

  • 状态:done
  • 归档时间:2026-06-27
  • 归档人:yaomd(批量归档)
  • 归档路径:code-copilot/changes/archive/2026-06-27-harden-multi-tenant-isolation/
  • 判定依据:任务清单全部完成,execution-log 验证通过(编译/构建/lint 闭环)。