Explorar el Código

docs(openspec): tick add-request-auth-replay-guard tasks 1-4

malk hace 2 semanas
padre
commit
bad4b2446f
Se han modificado 1 ficheros con 17 adiciones y 17 borrados
  1. 17 17
      openspec/changes/add-request-auth-replay-guard/tasks.md

+ 17 - 17
openspec/changes/add-request-auth-replay-guard/tasks.md

@@ -1,31 +1,31 @@
 ## 1. 签名工具与 Nonce 缓存
 
-- [ ] 1.1 新建 `mjava/src/main/java/com/malk/utils/UtilSignature.java`:HMAC-SHA256 静态方法 `sign(secret, method, path, body, timestamp, nonce)` → hex
-- [ ] 1.2 新建 `mjava/src/main/java/com/malk/core/NonceCache.java`:封装 `UtilToken.TimedCache`,API 为 `putIfAbsent(nonce) → boolean`
-- [ ] 1.3 单元测试:`UtilSignatureTest` 覆盖不同 method / 空 body / 中文 path
-- [ ] 1.4 单元测试:`NonceCacheTest` 覆盖 TTL 过期 / LRU 淘汰 / 并发
+- [x] 1.1 新建 `UtilSignature.java`:sha256Hex + sign(HMAC-SHA256) + safeEquals(常量时间比较)
+- [x] 1.2 新建 `NonceCache.java`:基于 Hutool TimedCache,TTL=window+30s,synchronized putIfAbsent
+- [ ] 1.3 单元测试:`UtilSignatureTest`(阻塞 Maven 未装)
+- [ ] 1.4 单元测试:`NonceCacheTest`(阻塞 Maven 未装)
 
 ## 2. 配置与注解
 
-- [ ] 2.1 新建 `com.malk.config.AuthConfigProperties`(`@ConfigurationProperties(prefix = "mjava.auth")`
-- [ ] 2.2 新建 `com.malk.config.AuthConfig`(`@Configuration`,根据 enabled 与 secret 条件装配)
-- [ ] 2.3 新建注解 `com.malk.filter.NoAuth`(`@Target({METHOD, TYPE}) @Retention(RUNTIME)`
-- [ ] 2.4 `application.yml` 补默认值 `mjava.auth.enabled: false`
-- [ ] 2.5 各子模块 `application-*.yml.example` 示例 `mjava.auth.*` 占位
+- [x] 2.1 新建 `AuthConfigProperties`(prefix mjava.auth,默认值齐全
+- [ ] 2.2 ~~独立 AuthConfig~~:不需要,AuthConfigProperties @Component 足够
+- [x] 2.3 新建 `NoAuth` 注解(METHOD + TYPE
+- [x] 2.4 `application.yml` 新增 mjava.auth.* 段,默认 enabled=false + ${AUTH_SECRET} 占位
+- [ ] 2.5 子模块 application-*.yml.example(延后,启用时同步)
 
 ## 3. Filter + Interceptor 两层
 
-- [ ] 3.1 新建 `com.malk.filter.AuthFilter`:Header 齐全 + 时间戳窗 + Nonce 去重;失败抛 `McException` 或直接写 `McR.fail()` 响应
-- [ ] 3.2 注册 `AuthFilter` 到 `WebConfiguration`,顺序在 `TraceIdFilter` 之后、业务之前
-- [ ] 3.3 新建 `com.malk.filter.AuthInterceptor`:`preHandle` 中签名校验 + `@NoAuth` 识别
-- [ ] 3.4 注册 `AuthInterceptor` 到 `WebMvcConfigurer`,排除 `exempt-paths`
-- [ ] 3.5 错误响应统一 `McR` 格式(见 design.md 错误码表)
+- [x] 3.1 `AuthFilter`:@Order(HIGHEST+20) 位于 TraceIdFilter 后;enabled/exempt 放行;Header + 时间戳窗口 + Nonce
+- [x] 3.2 靠 @Component + @Order 自动注册到 Spring Boot Filter 链
+- [x] 3.3 `AuthInterceptor`:preHandle 识别 @NoAuth + 读 body + 签名校验 + safeEquals
+- [x] 3.4 WebConfiguration 注册 AuthInterceptor
+- [x] 3.5 失败返回 `McR.error(code, message)` + 对应 HTTP 状态
 
 ## 4. 审计日志集成
 
-- [ ] 4.1 `AuthFilter` / `AuthInterceptor` 失败路径打 WARN 日志,字段:`authKey` / `failReason` / `clientIp` / `path` / `timestamp`
-- [ ] 4.2 成功路径向 MDC 写 `authKey`,`TraceIdFilter` 已有链路串联
-- [ ] 4.3 logback-spring.xml pattern 追加 `[%X{authKey:-}]`
+- [x] 4.1 AuthFilter / AuthInterceptor 失败分支 log.warn(point logger)
+- [x] 4.2 成功路径写 MDC authKey,finally 清理
+- [ ] 4.3 logback pattern 追加 `[%X{authKey:-}]`(延后)
 
 ## 5. 参考客户端实现(文档侧)