管理后台端点。仅系统角色为 admin 的用户可使用(经后台独立鉴权)。
后台采用独立鉴权,与主站会话隔离:
admin 的用户,后台账户有且唯一(见 console_admins)。admin)+ 输入后台密码,通过后签发后台 JWT。若该后台账户处于待设密状态(must_change_password = true,即新提升或已被重置),登录接口返回 403、error 为 ConsolePasswordNotSet,前端须引导其先走 POST /management/console/auth/set-password。admin;Authorization: Bearer {JWT}——校验后台会话有效(JWT 签名 + jti 在缓存中有效)。401。console_admins.role 分 admin(普通管理)与 super_admin(超级管理)。用户被提升为 admin 时创建后台账户并处于『待设密』状态(首次进入后台须先设置强密码,非自动生成);由后端终端 /admin 命令设置者为 super_admin 并随即生成强密码(见 后端命令系统)。SuperAdmin 的后台密码仅能由终端 /admin 控制,后台接口不可改、不可重置。缓存:主站会话与后台 JWT 均存于缓存,不落库,见 缓存。后台会话键 console_session:{jti}。
有效期说明:后台 JWT 不自动续期,
expiresIn固定(如 3600s)。JWT 先于主站 Cookie 过期时,需重新登录后台换取新 JWT(主站 Cookie 通常仍有效,可复用,无需重新登录主站;主站 Cookie 采用滑动过期自动续期,后台 JWT 不参与)。
| 端点 | 授权要求 |
|---|---|
| auth/login、logout、me | 已登录 admin(任意级别) |
| auth/set-password(首次设密) | 主站 Cookie + 系统角色为 admin(待设密态) |
| auth/reset-password(重置普通 Admin) | super_admin |
| users/{userId}/roles(变更系统角色) | 分级:super_admin 可改非 SuperAdmin;admin 可改非 Admin |
| identity-groups 增删改 / 分配移除 | super_admin |
| notifications(发站内通知) | admin(任意级别) |
| announcements 发 / 查 / 删 | super_admin |
| labels(标签建/删,系统角色 Admin) | admin(任意级别) |
| prefixes(前缀预设建/删) | super_admin |
| reload(配置热重载) | super_admin |
| audit-logs(后台审计) | admin(任意级别) |
后台登录。
请求(凭据):主站 Cookie + 后台密码。
{
"password": "系统生成的强密码"
}
后端处理:
admin,否则 401。console_admins)。jti 写入缓存 console_session:{jti},TTL = expiresIn。响应:200,响应体含 JWT(调用方需保存并在请求头携带):
{
"jwt": "<jwt>", // 后续放入 Authorization: Bearer
"expiresIn": 3600,
"role": "admin", // 后台级别 admin / super_admin
"userId": "be081dbc-..."
}
备注:
401,error 为 Unauthorized。must_change_password = true,新提升或刚被重置):返回 403、error 为 ConsolePasswordNotSet,并引导调用者执行 set-password。首次设置 / 重置后重设后台密码(顶替“首次进入后台手动设密”步骤)。
请求:主站 Cookie(要求系统角色为 admin)+ 请求体新密码。
{
"password": "强密码"
}
后端处理:
admin;console_admins.password_hash 并清除 must_change_password 标记。响应:204(此后可用正常 login 登录)。
备注:
400,error 为 ConsolePasswordWeak。400,error 为 SameAsMainPassword。SuperAdmin 重置某个普通 Admin 的后台密码(重置后该账户回到「待设密」状态,下次进入后台先设新密码)。
权限:后台级别 super_admin。
请求:主站 Cookie + Authorization: Bearer {JWT}。
{
"targetUserId": "be081dbc-..." // 被重置的普通 Admin 用户 ID
}
后端处理:校验目标为普通 admin(非 super_admin),清除其 password_hash 并置 must_change_password = true,写后台审计。
响应:204。
备注:
404,error 为 UserNotFound。403,error 为 Forbidden(SuperAdmin 密码只能由终端 /admin 控制)。登出后台,使 JWT 失效。
请求:主站 Cookie + Authorization: Bearer {JWT}。
后端处理:删除缓存 console_session:{jti}。
响应:204。
获取当前后台登录信息。
请求:主站 Cookie + Authorization: Bearer {JWT}。
响应:200:
{
"userId": "be081dbc-...",
"username": "user_be08...",
"role": "admin", // 主站系统角色
"consoleRole": "super_admin", // 后台级别
}
备注:Cookie 或 JWT 任一无效返回 401。
变更用户系统角色(user/helper/moderator/admin)。
权限(分级):
super_admin:可变更任何非 SuperAdmin 用户(user/helper/moderator/admin)的系统角色;admin:可变更任何非 Admin 用户(user/helper/moderator)的系统角色,但不可提升为 admin、也不可变更现有 admin/super_admin;/admin 控制)。请求:
{
"role": "moderator",
"reason": "任命版主" // 可选
}
后端处理:变更成功后清除该用户全部主站会话(缓存)以保证即时生效,写主站审计。
响应:200:
{
"userId": "be081dbc-...",
"previousRole": "user",
"role": "moderator",
"changedAt": "2026-08-08T10:30:00Z"
}
备注:
role 不在四者内返回 400,error 为 InvalidRole。404,error 为 UserNotFound。403,error 为 Forbidden。admin 时,同步创建其 console_admins 后台账户并置于待设密状态(must_change_password = true,首次进入后台须经 set-password 设置强密码);将用户从 admin 降级时,同步删除其后台账户。身份组元数据(identity_groups)在此后台管理。权限节点列表由配置文件定义,不在本组接口内;新增组后需在配置中补充其权限节点并热重载。
创建身份组。
权限:后台级别 super_admin。
请求:
{
"name": "groupA", // 唯一
"displayName": "Group A" // 可选
}
响应:201,返回新组信息。
备注:名称已存在返回 409,error 为 GroupNameTaken。
改名身份组。
权限:后台级别 super_admin。
请求:
{
"name": "groupA2",
"displayName": "Group A2"
}
响应:200。
备注:不存在返回 404,error 为 GroupNotFound。
删除身份组,并解除其下所有 user_groups 关联。
权限:后台级别 super_admin。
响应:204。
备注:不存在返回 404,error 为 GroupNotFound。
为用户分配身份组。
权限:后台级别 super_admin。
请求:
{
"groupId": "g_01H..."
}
响应:201。
备注:用户不存在 UserNotFound;组不存在 GroupNotFound;已分配 GroupAlreadyAssigned(均对应 404/409)。
移除用户的身份组。
权限:后台级别 super_admin。
响应:204。
备注:未分配返回 404,error 为 GroupNotAssigned。
给单个用户发送站内通知。
权限:后台级别 admin(含 super_admin)。
请求:
{
"targetUserId": "be081dbc-...",
"title": "欢迎加入社区",
"content": "这里是内容"
}
响应:201,返回通知对象:
{
"id": "n_01H...",
"targetUserId": "be081dbc-...",
"title": "欢迎加入社区",
"createdAt": "2026-08-08T10:30:00Z"
}
备注:目标用户不存在返回 404,error 为 UserNotFound。
发布全站公告(所有用户可见)。
权限:后台级别 super_admin。
请求:
{
"title": "维护通知",
"content": "将于今晚 00:00 停机维护。",
"published": true // 可选,默认 true
}
响应:201,返回公告对象:
{
"id": "a_01H...",
"title": "维护通知",
"published": true,
"publishedAt": "2026-08-08T10:30:00Z"
}
公告列表(后台查询,含未发布项)。
权限:后台级别 super_admin。
请求参数:page / pageSize。
响应:200,按 publishedAt 倒序:
{
"total": 2,
"page": 1,
"pageSize": 20,
"items": [
{ "id": "a_01H...", "title": "维护通知", "published": true, "publishedAt": "2026-08-08T10:30:00Z" }
]
}
删除一条全站公告。删除后不再对用户展示。
权限:后台级别 super_admin。
响应:204。
备注:不存在返回 404,error 为 AnnouncementNotFound。
Issue 标签的创建 / 删除由系统角色 Admin 完成;分配标签给议题及打开 / 关闭议题见 /management。
标签列表。
权限:后台级别 admin(含 super_admin)。
响应:200:
{
"labels": [ { "id": "l_01H...", "name": "bug", "color": "#dd3a0a" } ]
}
创建标签。
权限:系统角色 Admin。
请求:
{
"name": "bug", // 唯一
"color": "#dd3a0a" // 可选,默认 #000000
}
响应:201,返回标签对象。
备注:名称已存在返回 409,error 为 LabelNameTaken。
删除标签(并解除其与所有议题的关联)。
权限:系统角色 Admin。
响应:204。
备注:不存在返回 404,error 为 LabelNotFound。
前缀预设由后台 SuperAdmin 维护,版主在 /management 为用户分配。
前缀预设列表。
权限:后台级别 super_admin。
响应:200:
{
"prefixes": [ { "id": "p_01H...", "value": "[VIP]" } ]
}
创建前缀预设。
权限:后台级别 super_admin。
请求:
{
"value": "[VIP]", // 唯一
"displayName": "VIP 用户", // 可选,展示名
"backgroundColor": "#ffcc00" // 可选,默认 #000000
}
响应:201,返回前缀对象。
备注:值已存在返回 409,error 为 PrefixTaken。
删除前缀预设(该预设下所有 user_prefixes 关联一并清除;佩戴该前缀的用户其 users.prefix_id 同步置空)。
权限:后台级别 super_admin。
响应:204。
备注:不存在返回 404,error 为 PrefixNotFound。
热重载全部配置文件(含身份组权限节点、权限节点表、限速、OIDC 等)。
权限:后台级别 super_admin。
请求:无。
响应:200:
{
"reloaded": ["permissions.toml", "rate-limit.toml", "OIDC.toml", "identity.toml"],
"reloadedAt": "2026-08-08T10:30:00Z"
}
备注:任意文件解析失败返回 400,error 为 ConfigParseError,且不应用任何改动。
后台审计日志查询(只读)。
权限:后台级别 admin(含 super_admin)。
请求参数:adminId、action(前缀匹配)、result、from、to、page / pageSize。
响应:200,按 createdAt 倒序:
{
"items": [
{
"id": "clog_01H...",
"adminId": "be081dbc-...",
"action": "console.role_change",
"result": "success",
"ip": "203.0.113.1",
"userAgent": "Mozilla/5.0 ...",
"payload": { "targetUserId": "...", "role": "moderator" },
"createdAt": "2026-08-08T10:30:00Z"
}
],
"page": 1,
"pageSize": 20,
"total": 120
}
备注:action 取值参考下表:
| action | 说明 |
|---|---|
console.login / console.logout |
后台登录 / 登出 |
console.role_change |
变更用户系统角色 |
console.group_create / console.group_rename / console.group_delete |
身份组增删改 |
console.group_assign / console.group_remove |
分配 / 移除身份组 |
console.notification_send |
发站内通知 |
console.announcement_publish |
发全站公告 |
console.reload |
配置热重载 |
主站操作审计见 主站审计日志。