## 1. 模块脚手架 - [ ] 1.1 复制 `mjava-mcli/` 为 `mjava-com/` - [ ] 1.2 改 `pom.xml` artifactId 为 `mjava-com` - [ ] 1.3 改 `Boot.java` package 为 `com.malk.com_`(注意避开 java 保留字 `com`,用 `com_` 或 `gw`) - [ ] 1.4 改 `application.yml` port=9020 + context-path=/api/com - [ ] 1.5 根 pom `` 追加 `mjava-com` - [ ] 1.6 编译冒烟通过 ## 2. 调用方鉴权 - [ ] 2.1 `com.malk.com_.auth.CallerProfile`(数据类) - [ ] 2.2 `CallerRegistryService`(查宜搭权限表单,缓存 + 刷新) - [ ] 2.3 `CallerAuthInterceptor`(时间窗 → callerId → HMAC-SHA256 → enabled) - [ ] 2.4 注册拦截器到 WebMvcConfigurer,排除 `/health` 等公共端点 ## 3. 动作注册 - [ ] 3.1 `ActionRegistry`(`Map`) - [ ] 3.2 `ActionHandler` 接口:`McR handle(CallerProfile caller, JSONObject body)` - [ ] 3.3 `DingtalkActionRegistry`:在 `@PostConstruct` 注册至少 3 个 action(user.get / dept.list / workflow.start)作为首批 - [ ] 3.4 `AliworkActionRegistry`:首批 3 action(form.save / form.list / form.update) - [ ] 3.5 `ActionWhitelistConfig`(读 `application.yml` `com.actions.enabled`) ## 4. 网关 Controller - [ ] 4.1 `GatewayController` 路由 `POST /{vendor}/{action}` - [ ] 4.2 三层校验(代码 registry / yml whitelist / caller.allowedActions) - [ ] 4.3 统一异常返回 McR(AUTH_FAILED / ACTION_FORBIDDEN / RATE_LIMITED / VENDOR_ERROR) ## 5. 限流 - [ ] 5.1 `CallerRateLimiter`(Guava RateLimiter per callerId,LRU 容量 500) - [ ] 5.2 拦截器链路:Auth → RateLimit → Gateway ## 6. 审计日志 - [ ] 6.1 在基座 `UtilHttp` 审计基础上,com 侧拦截器补写入 MDC(callerId / vendorAction) - [ ] 6.2 logback-spring.xml 为 mjava-com 输出 `./log/{日期}/com-%X{callerId}.log` ## 7. 配置与文档 - [ ] 7.1 `application-dev.yml.example`(com.caller.registry.* + com.actions.enabled 示例) - [ ] 7.2 `application-prod.yml.example`(同上占位) - [ ] 7.3 `README.md`:外部系统对接步骤、signature 算法示例(Python / Node.js 样例代码) - [ ] 7.4 更新 `mjava-baseline.md` 表格里 mjava-com 状态为"已实施" ## 8. 验证 - [ ] 8.1 单元测试:`HmacSignatureTest` / `CallerRegistryTest` - [ ] 8.2 集成冒烟:模拟外部 Python 客户端签名 → 调 `/dingtalk/user.get` → 验证成功 & 失败(签名错、过期、限流、未启用 action) - [ ] 8.3 压测:单个 caller 限流准确性(RateLimiter 容差) - [ ] 8.4 `/opsx:validate add-mjava-com --strict` 通过