foren.dev

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 KeysEd25519 密钥对状态、公钥指纹
Audit管理员操作审计日志(谁、何时、做了什么)
Security2FA 设置、活跃会话查看与撤销
Settings站点与授权中心设置(路径、产品、限流等)

强密码策略

创建管理员时密码必须满足全部 6 项要求,否则被拒绝:

  • 长度 ≥ 12 位
  • 至少一个大写字母 A-Z
  • 至少一个小写字母 a-z
  • 至少一个数字 0-9
  • 至少一个特殊字符(非字母数字)
  • 不得与用户名相同

两步验证(TOTP)

在 Security 标签页为当前管理员账号启用:

  1. Setup 2FA — 系统生成 32 字符 base32 密钥(160-bit)
  2. 用 Authenticator App(Google Authenticator / 1Password / Authy)添加:
  • 手动输入密钥,或
  • 扫描页面显示的 otpauth:// URI
  1. 输入 App 显示的 6 位验证码 → Confirm
  2. 系统同时签发 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 并激活一台设备

  1. Licenses → + New License
  2. 填 holder / plan / expires
  3. Create,记下生成的 license_key
  4. (可选)记录到系统中
  5. 设备端调 /activate/ 用此 license_key

给客户颁发授权 token

  1. Auth Tokens → + Issue Token
  2. 选 license、product、name、days
  3. Create,复制明文 token(仅一次)
  4. 安全通道下发

注册 webhook

  1. Webhooks → + Register
  2. 输入 URL、选 scope (推荐 all)
  3. Register,复制 secret
  4. 客户端实现 HMAC 验证

签发 mTLS 证书

  1. Certs → + Generate Certificate
  2. 填 owner_name,可选关联 license
  3. Generate
  4. 复制证书 PEM
  5. 立即点击私钥下载 URL(30 分钟有效)
  6. 保存到 KMS

详细文档

完整页面说明:LICENSE_ADMIN.md(开发向)