租户 1 是平台模板租户,负责维护平台下发的应用、菜单、按钮以及租户管理员的默认授权范围。其他租户在创建时获得独立数据副本,后续由租户 1 的平台管理员按需增量同步。
同步不依赖客户端提交租户请求头。当前登录人必须是租户 1 的平台管理员,目标租户 ID 只是受控平台接口的业务参数。
upm_application.code 在租户内唯一且创建后不可修改,应用通过编码建立对应关系。upm_permission.source_id 保存租户 1 的模板菜单 ID。source_id 为空。source_id 为对应模板菜单 ID。source_id 为空,同步过程不会修改。(tenant_id, source_id) 唯一索引保证同一模板菜单在一个租户中只有一份副本。新建租户以租户 1 为模板,依次初始化设备端、默认部门、应用、第三方认证占位配置、菜单按钮和租户管理员。应用的 SSO 密钥、回调地址及注销推送地址不会复制。
每个业务租户只创建租户管理员,不再创建平台管理员。平台管理员只存在于租户 1。
预览和执行使用同一套差异计算规则。同步具有幂等性,没有模板变化时重复执行不会新增或更新数据。
GET /tenant/{id}/permission-sync/preview
POST /tenant/{id}/permission-sync
两个接口都需要 system:tenant:sync 权限,并在处理器中再次校验当前登录人属于租户 1 且拥有平台管理员角色。
增量脚本只增加来源字段、唯一索引和平台同步权限,不尝试通过名称、路由等不稳定字段匹配历史租户菜单。已有菜单但没有任何来源记录的历史租户会被同步接口拒绝,应清理后通过新流程重新创建。
数据库升级脚本:
sql/migration/20260925_tenant_permission_sync.mysql.sqlsql/migration/20260925_tenant_permission_sync.postgres.sql