Admin 后台使用文档
后台入口:<code>/admin/</code>
管理员账号登录后访问。本文档介绍 License 模块相关的 8 个页面功能。
导航
左侧栏:
| 页面 | 路径 | 谁能看 |
|---|---|---|
| --- | --- | --- |
| Overview | /admin/ | 管理员 |
| Projects | /admin/projects.php | 管理员 |
| Licenses | /admin/licenses.php | 管理员 |
| Auths | /admin/license_authorizations.php | 管理员 |
| Plans | /admin/license_plans.php | 管理员 |
| Auth Tokens | /admin/license_tokens.php | 管理员 |
| API Tokens | /admin/license_api_tokens.php | 管理员 |
| Certs | /admin/license_certs.php | 管理员 |
| Webhooks | /admin/license_webhooks.php | 管理员 |
| Stats | /admin/license_stats.php | 管理员 |
| ForenKey | /admin/forenkey.php | 管理员 |
| System | /admin/system.php | 管理员 |
Licenses(核心)
- 列表所有 license(搜索、过滤、分页)
- + New License — 创建新 license
- Activate — 设备激活、生成签名 payload
- Batch generate — 批量生成
- CSV Import — CSV 导入
- Offline Sign — 签发离线 license 文件
- Activation Logs — 激活审计
Auths(产品授权)
- 列出 license 的产品授权(per-license, per-product)
- 授权新 license 到某个产品
- 撤销授权
- 搜索 / 过滤
Plans(授权方案)
- CRUD for plans (Team, Enterprise, ...)
- 设置 features、max_members、max_cases、grace_days
- 启用 / 停用
- 不能删除:被 license 引用的 plan
Auth Tokens
- 颁发授权 token(明文仅显示一次)
- 撤销 / 删除
- 搜索 / 过滤
API Tokens
- 生成 API Token(明文仅显示一次)
- 重新生成 / 撤销
- 监控
last_used_at
X.509 Certificates
- 签发证书(明文 PEM 仅显示一次)
- 显示完整 PEM
- 吊销(加入 CRL)
- 私钥下载 URL(一次性、30 分钟有效)
Webhooks
- 注册 Webhook(返回 secret)
- 启用 / 停用 / 删除
- Failed Events 面板:失败重试
- 事件类型:license.activated, license.renewed, license.revoked, ...
Stats
- 概览卡片:总/活跃/过期/即将到期/宽限期中
- 每日激活柱状图
- 方案分布饼图
- Top holders 表
- 按产品统计
- 日期范围 + 产品过滤
ForenKey
- 设备列表
- 人员列表
- 设备 ↔ 取证员绑定关系
- 审计日志
System
/admin/system.php — 6 个标签页:
| 标签 | 功能 |
|---|---|
| --- | --- |
| Admins | 管理员列表、创建新管理员、启用/禁用、2FA 状态徽章 |
| API Tokens | 系统级 API Token 创建与吊销 |
| Signing Keys | Ed25519 密钥对状态、公钥指纹 |
| Audit | 管理员操作审计日志(谁、何时、做了什么) |
| Security | 2FA 设置、活跃会话查看与撤销 |
| Settings | 站点与授权中心设置(路径、产品、限流等) |
强密码策略
创建管理员时密码必须满足全部 6 项要求,否则被拒绝:
- 长度 ≥ 12 位
- 至少一个大写字母
A-Z - 至少一个小写字母
a-z - 至少一个数字
0-9 - 至少一个特殊字符(非字母数字)
- 不得与用户名相同
两步验证(TOTP)
在 Security 标签页为当前管理员账号启用:
- Setup 2FA — 系统生成 32 字符 base32 密钥(160-bit)
- 用 Authenticator App(Google Authenticator / 1Password / Authy)添加:
- 手动输入密钥,或
- 扫描页面显示的
otpauth://URI
- 输入 App 显示的 6 位验证码 → Confirm
- 系统同时签发 8 个一次性备用码(仅显示一次,需立即保存)
⚠️ 密钥必须是 base32。若改成 base64,标准 Authenticator App 会直接拒绝, 验证码永远无法通过。
tests/test_totp_2fa.php对此有回归断言。
备用码格式:XXXX-XXXX-XXXX-XXXX
- 字母表已剔除易混淆字符(无
0/O、1/I、L、U、V),便于抄写 - 输入时忽略大小写、空格和连字符(
k7qp 3rwm等价于K7QP-3RWM) - 每个码只能用一次,用完即作废
- 重新签发备用码 会作废所有未使用的旧码
- 禁用 2FA 会一并删除全部备用码
禁用 2FA:需输入当前有效的 6 位验证码确认,防止会话被劫持后恶意关闭。
登录流程:用户名 + 密码 → (若已启用 2FA)跳转 /admin/verify-2fa.php → 输入 6 位验证码或备用码 → 进入后台。
失败锁定:连续 5 次密码错误锁定 15 分钟(locked_until),防止暴力破解。
会话管理
Security 标签页的 Sessions 区域列出当前账号的所有活跃会话:
| 字段 | 含义 |
|---|---|
| --- | --- |
| IP | 会话来源 IP |
| User-Agent | 浏览器/客户端标识 |
| Created | 会话创建时间 |
| Last Active | 最后活动时间 |
| Current | 标记当前会话 |
- Revoke — 撤销指定会话(该会话下次请求时被登出)
- Revoke Others — 一键撤销除当前会话外的所有会话
会话记录在 admin_sessions 表,登出或过期后标记 revoked_at。
公共操作流程
创建一个新 license 并激活一台设备
- Licenses → + New License
- 填 holder / plan / expires
- Create,记下生成的
license_key - (可选)记录到系统中
- 设备端调
/activate/用此license_key
给客户颁发授权 token
- Auth Tokens → + Issue Token
- 选 license、product、name、days
- Create,复制明文 token(仅一次)
- 安全通道下发
注册 webhook
- Webhooks → + Register
- 输入 URL、选 scope (推荐
all) - Register,复制 secret
- 客户端实现 HMAC 验证
签发 mTLS 证书
- Certs → + Generate Certificate
- 填 owner_name,可选关联 license
- Generate
- 复制证书 PEM
- 立即点击私钥下载 URL(30 分钟有效)
- 保存到 KMS
详细文档
完整页面说明:LICENSE_ADMIN.md(开发向)