权限模型与危险操作
控制台的权限是“RBAC-lite”:根凭据拥有 owner 权限,子账号分四档(owner > admin > operator > viewer)。本页说明每档能做什么、哪些操作不可逆、以及如何用审计日志追溯。
四档角色
| 角色 | 读取(GET) | 写入(POST 业务配置) | 特权(账号/密钥) | 典型用途 |
|---|---|---|---|---|
| owner | ✅ | ✅ | ✅ | 负责人:可管理子账号、重置密钥、删除应用 |
| admin | ✅ | ✅ | ✅(不能改 owner 账号) | 运维主管:日常配置与应急处置 |
| operator | ✅ | ✅ | ❌ | 客服/运营:封禁、禁言、解散群、审核裁决 |
| viewer | ✅ | ❌ | ❌ | 只读:值班观察、数据核对 |
判定规则:读取接口任意角色可用;写入接口要求 operator 及以上;账号管理与密钥重置要求 admin 及以上;涉及 owner 账号本身的变更要求调用者为 owner。角色不足返回 403。
子账号管理
| 操作 | 接口 | 约束 |
|---|---|---|
| 创建子账号 | POST /accounts | 字段 {accountId,name?,role};创建 owner 需调用者自身为 owner;上限 200 个账号 |
| 更新/停用/轮换 token | POST /accounts/{accountId} | rotateToken=true 立即失效旧 token;不可停用/降级最后一个启用中的 owner |
| 列出账号 | GET /accounts | 只返回账号元数据,不返回 token |
| 删除账号 | DELETE /accounts/{accountId} | 同样受 owner 保护规则约束 |
| 鉴权头 | — | X-Admin-Account + X-Admin-Token;根凭据继续用 X-Admin-Secret |
Shell
# 创建 operator 子账号(token 只在本次响应返回)
curl -sS -X POST http://127.0.0.1:8080/api/admin/accounts -H 'X-Admin-Secret: dev-admin' \
-H 'content-type: application/json' \
-d '{"accountId":"ops-1","name":"值班运营","role":"operator"}'
# 用子账号调用(只读接口)
curl -sS http://127.0.0.1:8080/api/admin/apps/demo/audit -H 'X-Admin-Account: ops-1' -H 'X-Admin-Token: <本次返回的 token>'
# 轮换子账号 token(旧 token 立即失效)
curl -sS -X POST http://127.0.0.1:8080/api/admin/accounts/ops-1 -H 'X-Admin-Secret: dev-admin' \
-H 'content-type: application/json' -d '{"rotateToken":true}'危险操作清单
下面这些操作影响面大且多数不可逆,执行前必须确认影响范围、通知相关方,并在执行后核对审计日志。
| 操作 | 接口 / 页面 | 后果 | 要求 |
|---|---|---|---|
| 重置 AppSecret | POST /apps/{appkey}/secret/reset · 应用与密钥 | 旧签名立即失效,所有使用旧密钥的 Open API 调用返回 1018;不可回滚 | admin+;需密钥管理系统配合 |
| 删除应用 | DELETE /apps/{appkey} | 软删除:数据保留、默认列表隐藏,可恢复 | admin+ |
| 恢复应用 | POST /apps/{appkey}/restore | 恢复被软删的应用 | admin+ |
| 封禁用户 | POST /apps/{appkey}/users/{userId}/ban | 立即踢下线,封禁期间不能建连(1016) | operator+ |
| 禁言用户 | POST /apps/{appkey}/users/{userId}/mute | 仅限制发送(1009),不影响接收 | operator+ |
| 解散群 | POST /apps/{appkey}/groups/{groupId}/dismiss | 移除群与群级附属状态,消息历史保留供审计,触发 group.destroyed | operator+ |
| 销毁聊天室 | POST /apps/{appkey}/chatrooms/{chatroomId}/destroy | 踢出在线成员并广播销毁,不可恢复 | operator+ |
| 清理历史消息 | POST /im/v2/message/history/clean(Open API) | 服务端历史与补发被清理,客户端本地库不受影响 | 应用签名 |
| 更新回调配置 | POST /apps/{appkey}/callbacks/config | 密钥/地址变更立即生效,旧密钥签名验不过 | operator+ |
| 设置敏感词与拦截动作 | POST /apps/{appkey}/sensitive-words | 立即影响发送(1010/掩码),批量导入需谨慎 | operator+ |
| 设置接口限频 | POST /apps/{appkey}/ratelimit | 过低的 QPS 会导致业务 429/1008 | operator+ |
| 管理子账号 | /accounts/** · 子账号与 RBAC | 权限变更/停用/token 轮换立即生效 | admin+/owner(涉 owner) |
审计与追溯
管理端写操作会写入操作日志(环形上限 5000 条):actor、action、object、result、timestamp。按应用查询:GET /api/admin/apps/{appkey}/audit?actor=&action=&object=&from=&to=&offset=&limit=,时间倒序。
Shell
# 查最近的重置密钥与封禁动作
curl -sS 'http://127.0.0.1:8080/api/admin/apps/demo/audit?action=apps.secret.reset&limit=20' -H 'X-Admin-Secret: dev-admin'
curl -sS 'http://127.0.0.1:8080/api/admin/apps/demo/audit?action=users.ban&from=1750000000000&limit=50' -H 'X-Admin-Secret: dev-admin'审计不等于回滚
操作日志只记录“谁在什么时候做了什么”,不保存被覆盖前的配置快照。
危险操作前请先导出当前配置(例如回调配置、敏感词表、限频规则),或记录在变更单里。
环形上限 5000 条:高频写入会滚动覆盖旧记录,需要长期留存请定期导出。
最小权限落地建议
- 值班/观察:只给 viewer;需要处置时临时提升或使用专门的 operator 账号。
- 日常运营:operator;不要给 admin(避免误重置密钥)。
- 密钥与账号管理:admin 只给 1-2 人,owner 仅在需要转让/删除时使用。
- 子账号 token 与根密钥分别存放在不同的密钥管理系统条目,轮换互不影响。
- 每次危险操作后核对审计日志(actor/action/object/result)并记录变更单编号。