5.2 KiB
5.2 KiB
外管后台
系统边界
外管后台是独立于主后台、Databi 和 Finance 的浏览器入口:
- 主后台
/operations/external-admin-users继续使用主后台 JWT、RBAC 和全局 App 选择器,只负责查找 App 用户、签发外管账号、启停账号和重置密码。 - 外管入口
/external-admin/使用独立账号、服务端 opaque session、CSRF token 和首次改密流程,不读取主后台 token 或 localStorage。 - 外管账号、会话、登录日志和操作日志分别保存在
external_admin_accounts、external_admin_sessions、external_admin_login_logs、external_admin_operation_logs。 app_code固化在账号和会话中。Fami 账号只能访问 Fami 数据;请求头缺省时由会话补齐,伪造其他 App 时直接拒绝。
账号签发和岗位边界
创建账号时必须先在当前 App 内用长 ID、短 ID 或靓号精确匹配用户,再提交服务端返回的稳定 user_id。昵称不参与绑定,避免重名用户拿到外管凭据。
platform-admin:查看、创建、启停和重置密码。创建和重置等同于签发一组固定的高权限外管能力,因此只允许平台管理员执行。ops-admin、operations-specialist:查看、启停。运营岗位不能通过创建或重置账号间接获得自身权限矩阵中没有的 VIP 发放等能力。- 同一 App 内,外管账号名和绑定 App 用户均唯一;不同 App 可以使用同名外管账号。
- 创建、重置后的临时密码必须首次修改;停用或重置会撤销该账号的全部活跃会话。
外管能力
外管只注册显式白名单路由,不提供主后台的通用代理能力:
- 用户:用户列表、资料编辑、封禁列表、封禁和解封。
- 组织:主播、公会、BD、BD Manager、Super Admin 列表和我的团队。
- 房间:房间列表和房间编辑。
- 发放:特权道具、靓号、用户称号、房间背景图和财富/VIP 等级。
- 运营:Banner 创建。
底层业务写入仍由各 owner service 或既有后台 Handler 负责;外管模块只做独立认证、App 约束、权限白名单和审计,不复制用户、房间或钱包业务事实。
登录安全
- Session cookie 为 HttpOnly,作用域仅
/api/v1/external;写请求同时校验 CSRF cookie、header 和服务端 hash。 - Session 绝对有效期默认 12 小时。每次请求都会确认账号和 App 仍为 active;App 停用后旧会话不能绕过
/auth/me直接调用业务接口。 - 同一账号连续失败 5 次后锁定 15 分钟;App、账号和密码错误对外使用统一文案。
- Redis 在 MySQL 查询、bcrypt 和登录日志之前执行 60 秒固定窗口限流:系统全局 300、单 App 120、单 IP 30、单 App+账号 10。四层计数在一次 Lua 中原子完成,拒绝请求仍消耗总闸配额。
- 登录请求体上限为 8 KiB;限流 Redis 在 200 ms 内不可用时 fail-closed 返回 503,不降级为可绕过的单机计数。
- 认证接口统一返回
Cache-Control: no-store。
上线步骤
- 通过 admin-server 迁移器依次应用
migrations/098_external_admin_portal.sql和migrations/099_external_admin_credential_delegation.sql。098 只新建四张认证/审计表并按唯一索引写入菜单和权限元数据;099 通过角色、权限唯一索引和关联表主键定点撤销旧版 098 可能误授予运营岗位的凭据权限。两者都不扫描用户、房间、钱包等大业务表;不要在高峰期临时改写迁移内容。 - 确认 Redis 已启用且
/readyz为成功。生产配置缺少 Redis 时 admin-server 会拒绝启动,运行中限流 Redis 故障会阻断新登录但不破坏已建立会话。 - 配置
trusted_proxies为真实入口链路的精确 IP/CIDR。默认只信任 loopback;不要信任0.0.0.0/0、::/0或整段未知私网。 - 构建并发布前端
dist/external-admin/,保留 Nginx 对/external-admin的 301 和所有/external-admin/*深链回退到独立 HTML。 - 在 EdgeOne/WAF 对精确路径
POST /api/v1/external/auth/login配置按真实客户端 IP 的 token-bucket/挑战规则,建议基线 30 次/分钟、burst 10;同时限制源站直连。WAF 负责 Redis 前的大包和连接洪峰,应用层 Redis 负责系统、App 和账号维度的正确性。
上线验收
- Fami 创建的账号登录后请求 Lalu 的
X-App-Code必须返回 403,省略 header 时仍只能看到 Fami 数据。 - 外管账号或 App 停用后,已有会话直接访问任一业务接口必须返回 401。
- 临时密码登录后,除会话、退出和修改密码外的业务接口必须返回 403;改密后才可进入授权页面。
- 从同一真实 IP 连发超过阈值的登录请求必须返回 429 和
Retry-After;伪造X-Forwarded-For不能改变限流身份。 - Redis 临时不可用时新登录应在约 200 ms 后返回 503;恢复后不需要重启服务。
/external-admin/、一个桌面深链和一个移动端深链均返回外管独立 HTML,不能回退到主后台入口。- 停用、密码重置、封禁、房间编辑、资源/VIP 发放和 Banner 创建均应在外管操作日志中留下 App、外管账号、请求 ID、资源 ID 和结果。