Files
cpa-plugin/docs/modules/user-access-management.md
T

146 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 用户与访问管理
## 模块定位
用户与访问管理负责识别调用者,并决定该调用者可以使用哪些模型、请求应由哪个上游账号处理。
本项目不建立独立的用户账号体系,而是采用最小模型:
> 一个 Key 代表一个用户。
管理员直接管理 Key;Key 的稳定 ID 用于关联用量、额度和历史记录,Key 名称用于界面识别,Key 值用于请求认证。
## 当前能力
| 能力 | 当前实现 |
| --- | --- |
| Key 创建 | 支持自动生成或手动指定 Key 值 |
| Key 状态 | 支持启用、禁用和归档 |
| 下游认证 | 支持 `Authorization: Bearer <key>``X-Api-Key` |
| 模型权限 | 支持允许全部模型、精确模型名和 `*` 通配符 |
| 上游路由 | 支持 CPA 自动选择或严格绑定一个上游账号 |
| 默认迁移 | 首次启动自动创建 `default` Key,兼容现有调用配置 |
| 历史关联 | Key 的请求、用量、额度和账目均按稳定 ID 关联 |
## Key 数据模型
每个 Key 包含以下访问属性:
| 属性 | 说明 |
| --- | --- |
| ID | 系统生成的稳定标识,用于内部关联,不随名称变化 |
| 名称 | 管理员可读的用户名称,长度为 1–64 个字符 |
| Key 值 | 下游请求凭证;创建后不可修改 |
| 状态 | `active``disabled``archived` |
| 路由模式 | `auto``strict` |
| 上游账号 | 严格路由时绑定的 CPA 上游账号 |
| 模型规则 | 允许全部模型,或一组模型匹配规则 |
Key 值允许 6–256 个非空白、非控制字符。未手动填写时,系统生成以 `cpa_` 开头的随机值。
## 状态规则
| 状态 | 是否可以调用 | 是否可以编辑 | 是否保留历史 | 是否可以恢复 |
| --- | --- | --- | --- | --- |
| `active` | 是 | 是 | 是 | 不适用 |
| `disabled` | 否 | 是 | 是 | 可以重新启用 |
| `archived` | 否 | 否 | 是 | 不可以 |
禁用用于临时停止用户访问;归档用于永久退出管理。归档不会删除请求、用量、额度或计费账目,默认 Key 列表不再显示已归档项。
## 模型权限
模型匹配不区分大小写,并忽略规则首尾空白。
- “允许全部模型”开启时,不再读取单独的模型规则。
- “允许全部模型”关闭时,至少需要一条模型规则。
- 手工输入的 Key 必须为 6-256 个不含空白或控制字符的字符;留空时自动生成。
- 不含 `*` 的规则执行精确匹配,例如 `gpt-5.6-sol`
- `*` 可以匹配任意长度的文本,例如 `deepseek-*``*-flash``gpt-*-codex`
- 空模型名不能通过模型准入。
请求模型不符合规则时,请求在到达上游前被拒绝,返回 HTTP 403 和错误码 `model_not_allowed`
## 上游路由
### 自动路由
`auto` 模式不绑定具体账号,由 CLIProxyAPI 根据当前可用候选、优先级和自身调度规则选择上游。
切换到自动路由后,Key 原有的上游绑定会被清空。
### 严格路由
`strict` 模式必须选择一个已经由 CLIProxyAPI 发现的上游账号。插件在调度阶段只选择该账号,不允许静默回退到其他账号。
出现以下情况时,请求返回 HTTP 503 和错误码 `bound_upstream_unavailable`
- 绑定的账号已经不存在;
- 绑定账号不在本次 CPA 实时可用候选中;
- 调度完成后的实际上游与绑定账号不一致。
上游账号信息来自 CLIProxyAPI 的账号列表和实际调度候选。持久化状态用于管理台展示,本次调度候选才是请求时的可用性依据,避免账号恢复后被旧状态继续拦截。插件只保存路由所需的账号标识、提供商、显示名称和状态,不读取或保存上游 Token、Cookie 等凭证内容。
## 默认 Key 与新建 Key
首次启动且数据库中没有任何 Key 时,插件根据配置创建第一个 Key:
- 默认名称:`default`
- 默认 Key 值:`000000`
- 默认状态:启用
- 默认路由:自动
- 默认模型权限:允许全部模型
该行为用于让已有 Codex/CLIProxyAPI 调用配置无需修改即可迁移到插件管理。
之后创建新 Key 时,系统按稳定 ID `key_default` 复制默认 Key 当时的模型权限和上游路由,再应用管理员本次明确填写的设置。管理员重命名默认 Key 不影响继承。复制只发生在创建时,后续修改默认 Key 不会影响已经创建的 Key。
如果数据库中已经存在 Key,启动配置不会覆盖或重新创建 `default`
## 请求处理流程
| 阶段 | 模块行为 |
| --- | --- |
| 1. 提取凭证 | 从 Bearer Token 或 `X-Api-Key` 读取 Key |
| 2. 身份认证 | 查找 Key,并确认状态为 `active` |
| 3. 建立调用身份 | 使用稳定 Key ID 作为下游调用者身份 |
| 4. 模型准入 | 使用请求模型匹配该 Key 的模型规则 |
| 5. 上游调度 | 自动委托 CPA,或选择严格绑定的账号 |
| 6. 路由复核 | 严格模式下确认实际选择的账号与绑定一致 |
认证失败不会进入后续访问判断。Key 在请求过程中被停用时,后续拦截仍会再次检查状态,避免仅依赖认证阶段的旧状态。
额度、并发和价格检查发生在同一条请求准入链路中,但分别属于“额度与计费”和“价格配置”模块,不在本文展开。
## 管理操作
管理员页面当前支持:
- 查看有效 Key,按需包含已归档 Key;
- 创建并复制 Key
- 修改名称、启用状态、模型规则和上游路由;
- 临时禁用或重新启用 Key
- 永久归档 Key
- 同步并选择 CLIProxyAPI 当前可见的上游账号;
- 根据历史请求和价格配置获得模型名称建议;
- 查看该 Key 的累计、今日和最近使用记录。
管理操作通过受 CLIProxyAPI Management Key 保护的管理接口完成。匿名页面只能读取服务端脱敏后的真实数据,不返回完整 Key,也不能创建、修改、重置或归档。
## 模块边界
本模块负责:
- Key 身份与生命周期;
- 下游请求认证;
- 模型访问规则;
- 上游账号选择策略。
本模块不负责:
- 用户注册、密码、登录会话和角色权限;
- 套餐、充值、支付和订单;
- 额度扣减、周期重置和并发计数;
- 模型价格维护与成本计算;
- CLIProxyAPI 上游账号本身的登录、刷新或凭证维护。