feat(auth,gateway,user): X-API-Key 真接线 + key 一律超管 + owner 档案真落盘(裁决 15.4.2/15.4.3/10.4.5/08.4.2)
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

- 15.4.2:管理 API 与 Bearer 共用同一 Authorize 路径,X-API-Key 命中签发表即过门;未知/已吊销/空值 401 且不回落 Bearer(fail-closed)
- 15.4.3:key 表去掉角色维度,任一有效 key 鉴权后即 owner;签发接口取消 role 分级(不再读请求体)
- 10.4.5:新增 GET/PUT /api/v1/admin/owner-profile(owner-only,PUT 带审计 owner.profile.update),0600 原子落盘 + 活档案热替换;前端主人档案改接真实 API,读不到即禁用保存,删掉硬编码默认档案
- 08.4.2:persona 的 identity.systemPrompt 必填,缺失/空白 400 显式报错,不再派生回落
This commit is contained in:
AskaEth committed 2026-10-04 12:07:51 +08:00
1 parent 8c6466cb00
commit adef36538f
13 files changed
+1223 -199

No files matched your search

+11
View File
@@ -29,6 +29,17 @@ func LoadOwnerProfile(path string) (*OwnerProfile, error) {
return p, nil
}
// Validate 用与 LoadOwnerProfile 完全相同的一套规则校验一份**内存中**的档案,
// 使管理面板的写路径能在落盘前就拒掉坏档案,而不是先写进磁盘、等下次启动才
// 报错。它只校验必填字段与半空的 accounts 项,不校验平台名是否已知
// (适配器可以后装)。
func (p *OwnerProfile) Validate() error {
if p == nil {
return fmt.Errorf("%w: empty profile", ErrRequiredField)
}
return p.validate()
}
// validate checks the owner profile for its required fields and for partial
// whitelist entries. An empty whitelist is allowed: on a fresh install nobody
// has been configured as owner, so the policy engine defaults to deny until the