feat: 新增 @SimApiSign 与 @AesBody 注解(对齐 C# SimApiSignAttribute / AesBodyAttribute)

- src/annotations/SimApiSign.cj:方法/类级声明式验签注解,keyProvider 用类型名(DI 解析)
- src/annotations/AesBody.cj:参数级声明式 AES body 解密注解
- SimApiRequestDelegateFactory 自动执行:
  - checkSimApiSign:解析 @SimApiSign → DI 取 SimApiSignProviderBase → SimApiSignChecker.verify
  - bindAesBody:@AesBody 参数 → DI 取 AesBodyProviderBase → decryptBody → 按类型反序列化
- 注解未指定类型名时用默认空实现(未配置即报错,对齐 C# 行为)
This commit is contained in:
2026-08-18 00:35:59 +08:00
parent d76b08a542
commit ef9765de5d
4 changed files with 158 additions and 10 deletions
+34
View File
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2025 SimcuTeam. All rights reserved.
* 移植自 C# 项目 SimApiE:\simcu\simapi-net),遵循 MIT 许可证。
* 声明式签名校验注解(对齐 C# SimApi.Attributes.SimApiSignAttribute)。
*
* 标注在控制器方法或类上,请求派发时(SimApiRequestDelegateFactory)自动执行验签:
* - 提取 appId / timestamp / nonce / signQuery 优先,其次 Header
* - 通过 keyProviderDI 解析)获取密钥
* - 过期校验 + nonce 去重(需缓存)
* - 拼接 SignFields + appId + timestamp + nonce + keyMD5 比对
*
* 用法:
* @SimApiSign // 默认 SimApiSignProviderBase(应用需注册实现)
* @SimApiSign["MySignProvider"] // 指定 provider 类型名(DI 注册的实现类)
*
* 说明:仓颉注解参数须为编译期常量,无法直接持有 Type;
* 故 keyProvider 用类型名 String,运行时经 TypeInfo.get 解析后从 DI 取实例。
*/
package simapi.annotations
@Annotation[target: [MemberFunction, Type]]
public class SimApiSign {
/// 签名提供器类型名(DI 注册的 SimApiSignProviderBase 实现类名)
public let keyProvider: String
public const init() {
this.keyProvider = ""
}
public const init(keyProvider: String) {
this.keyProvider = keyProvider
}
}