权限模型
管理面权限=scope(命令族×读写)+租户绑定二元组的声明制模型。
密钥三元组
AdminKey = ( Token, Scopes, TenantBinding )
| 组成 | 语义 |
|---|---|
Token |
Bearer 载体(worker.json admin.keys 或租户登录密钥) |
Scopes |
授权集:{命令族}:{read|write},* 通配 |
TenantBinding |
可绑租户段——绑定后仅该租户的 {tenant} 路由可达 |
系统令牌(平台面,密钥文件配置)与租户令牌(登录密钥签发,自动绑定租户)共用本模型。
scope 词表
scope 的"命令族"即契约源 tags(29 族):config:write、config:read、
publish:write、cluster:read、plugin:write、sys:*、*(全权)……
- 读(GET)要
{族}:read,写(POST/PUT/DELETE)要{族}:write; - 零副作用 POST(dry-run/simulate 等只读语义)按契约标注为 read——不需要 write scope;
- 生命周期动词(plugin enable/disable)按契约标注执法。
403 语义(结构化信封)
{ "code": "KernLab.Traffic.Auth.Scope",
"message": "…需要 publish:write…", "traceId": "…" }
| 信封 code | 语义 |
|---|---|
KernLab.Traffic.Auth.Scope |
缺 scope(信封里指明缺什么) |
KernLab.Traffic.Auth.TenantScope |
租户边界越界(实例级路径/他租户资源) |
403 不是裸文本——自动化按 code 分支处理;message 面向人。
whoami(身份投影)
curl -H "Authorization: Bearer $KEY" http://127.0.0.1:7901/api/v1/sys/whoami
返回 {kind, tenant, masks, scopes}——masks=族→操作位掩码、scopes=字符串原形
(审计对账用)。鉴权通过即可访问 whoami(免 scope)——探活身份的第一站。
租户登录密钥
租户可自签发子密钥(key 命令族:issue/list/revoke/delete):
- 明文一次性展示(
tc_live_…),仅存指纹; - scopes ≤ 签发者、自动绑定本租户;
- 吊销即时生效(轮询窗内)、有效期原生 TTL;
- lastUsedAt 双键分离(审计可见最后使用时刻)。
组件级执法(控制台)
UI 导航按身份 kind×scope 动态下发(无权限的功能不渲染);组件级功能点由
v-perm 唯一原语控制(禁用/隐藏两形态)——权限模型单一来源,无前端独立判断逻辑。