本文档由 g2rain-basisdocs/architecture/deviations.md 自动同步生成。
# 架构差异与接入项

项目已在中央项目目录按 java-domain-service 1.0.0 登记为 planned。以下事项完成决策、实现和验证前,不应宣称已正式采用该 Profile。

# BAS-001:API 模块发布同步写契约

g2rain-basis-api 除查询外,还发布登录令牌保存、租户加入、Passport/IdP 绑定、企业 IdP 组织保存、企业应用授权写入与撤销、IdP 同步等同步命令。其中一部分是 IAM 等受信服务必需的业务协作,不是通用 CRUD,但仍属于中央 Profile 的同步写入例外。

  • 当前保护:部分接口使用 /internal 路径并隐藏 OpenAPI;关键用例在 Service 中进行事务、幂等或状态校验。
  • 已补文档:当前调用方向、代表契约与目标控制见受信服务 API 与跨服务协作
  • 待补实现证据:逐项确认可验证的服务身份、授权范围、重试/幂等、超时、兼容和审计;能由 App 经 Gateway 或领域事件承接的写入不得继续扩大服务直连范围。
  • 复审:接口调用关系变化、中央 Profile 调整同步写规则,或新增写契约时。

# BAS-002:跨服务同步写链路

租户开通和 IdP 同步流程会直连 IAM,并通过 g2rain-department-api 调用 Department 同步命令。该链路跨越多个服务,单个本地事务不能提供全局原子性。

  • 当前保护:Basis 的核心写入使用本地事务;IdP 同步包含删除比例、不完整快照和空快照安全阈值。
  • 已补文档:跨服务步骤、本地事务边界、部分成功事实和目标恢复策略见受信服务 API 与跨服务协作
  • 待补实现证据:稳定重试键、重复请求结果、部分成功补偿、超时与告警;验证 Basis 与 Department 的版本发布顺序。
  • 复审:引入事件驱动编排或可靠补偿机制后。

# BAS-003:逻辑删除唯一索引

初始化脚本中的多处唯一键未采用中央 Profile 的有效行函数索引。例如 IdP 绑定、应用 IdP 开通、企业应用授权、服务编码、API 路径和 Token 哈希等唯一键需要分别决定“删除后释放”还是“永久占位”。现有普通唯一键以及 UNIQUE (..., delete_flag) 不能一律视为符合基线。

迁移前必须梳理每个业务键的生命周期、历史重复数据、MySQL 版本、上线顺序和回滚方案;删除后允许重建的键使用 IF(delete_flag = 0, 0, NULL),永久占位的键不包含 delete_flag

# BAS-004:开发凭证进入版本库

application.ymlapplication-dev.yml 当前包含面向本地环境的默认 Nacos/数据库凭证。文档不会复制具体值;接入基线前应改为环境变量、私有本地覆盖或 Secret,并在凭证曾被复用时完成轮换。

# BAS-005:受信接口的安全边界证据不足

/internal 路径和 @Operation(hidden = true) 只隐藏文档,不能证明服务身份与授权已生效。当前还存在多个 WithoutIsolation 查询与写入路径,它们服务于登录、租户开通、IdP 解析和同步等跨租户受信流程。

应为每个入口补充调用方、可信上下文来源、组织范围校验和越权测试;任何新调用都不得仅凭路径前缀获得信任。

# BAS-006:验证覆盖仍不完整

2026-09-03 执行 mvn clean verify 通过,12 个测试类共 64 项测试全部成功,覆盖租户开通、IdP 同步安全、Passport 绑定、企业应用授权、静态访问令牌和部分权限规则。DAO/Mapper、真实数据库唯一约束与逻辑删除、Controller 访问控制、数据隔离 AOP、Kafka 审计消费、缓存同步和 Startup 组装仍缺少可见的集成验证证据。

构建还报告 RoleControlUnitRelationConverterdescription 未映射警告,以及 Mockito 动态加载 Java Agent 的未来 JDK 兼容警告;本次仅补文档,未修改实现或构建配置。