Registration Approval.zh CN - houyhlouis/LLMOJ GitHub Wiki
新用户注册审核
网站可以选择以下三种注册模式之一:
| 模式 | registrationMode |
有人注册时 |
|---|---|---|
| 自由注册 | open(默认) |
账号立即可用 |
| 管理员审核 | approval |
生成一份申请,审核通过后才能登录 |
| 关闭注册 | closed |
不能注册;已有账号照常登录和找回密码 |
切换模式不会影响已有账号,也不会自动通过待审核或已拒绝的申请。
选择注册模式
- 用站点管理员账号登录,在用户菜单中选择 网站管理(
/site-management)。 - 选择注册模式并点击 保存。新模式从下一次请求起生效,无需重启;已经打开的注册页面刷新后即可看到。
- 如需改回服务器配置文件中的模式,点击 恢复服务器配置。
只有站点管理员可以修改注册模式;有审核权限或首页编辑权限的用户不能修改。
在这里保存的模式存放在数据库中,重启和升级后仍然有效,并且优先于 config/backend.yaml。没有保存时使用配置文件中的值;配置文件也没有设置时为自由注册。
配置文件中的默认值
如需修改服务器的默认模式,在 config/backend.yaml(通常是 /opt/LLMOJ/config/backend.yaml)已有的 preference.security 部分中加入 registrationMode:
preference:
security:
registrationMode: approval
# 保留这里原有的其他设置
只能填写小写的 open、approval 或 closed;其他值会导致后端无法启动。修改文件后需要重启后端。网站管理 中保存的模式仍然优先。
如果以前在 Nginx 中拦截了 /api/auth/register,无论选择哪种模式,这个拦截都仍然有效。需要开放注册时,删除该规则并重载 Nginx;升级不会修改你的 Nginx 配置。
审核申请
用户填写用户名、邮箱和密码注册。如果网站要求邮箱验证,仍需先完成验证。注册后生成的是一份申请而不是账号:申请人没有用户 ID,不能登录,也不会出现在用户列表中。
在用户菜单中选择 注册审核(/registration-reviews),按状态筛选申请(待审核、已通过、已拒绝或全部),然后逐个 通过 或 拒绝,可以填写最多 500 字的备注。
- 通过会创建账号并分配用户 ID,用户用注册时的密码登录。
- 拒绝不会创建账号。已拒绝的申请之后仍可通过;已通过的申请不能再拒绝。
- 如果用户名或邮箱在此期间已被占用,通过操作会失败,申请保持不变。解决冲突后再试。
备注只有审核者能看到。申请人登录时会看到申请正在审核或已被拒绝的提示。审核结果不会发送邮件。
待审核和已拒绝的申请会继续占用其用户名和邮箱。为了保留记录,不能重新申请或删除申请;也不要直接删除数据库中的行来绕过。
审核只决定谁能获得账号;游客原本能看到的页面仍然对游客可见。
让其他人审核
站点管理员始终可以审核。要让其他用户审核:
- 打开 权限管理(
/permissions),选择该用户。 - 在 管理特权 中,把 管理注册审核(含拒绝后批准) 设为 允许,然后点击 保存权限。
审核者刷新页面后即可看到 注册审核,包括申请人的邮箱和备注。把该权限设为 拒绝 即可收回。管理用户或用户组的权限不包含审核权限;被禁止访问网站的用户也不能审核。
审核者不会因此成为管理员:不能修改权限,也不能修改管理员的资料或密码。
每次审核都会记录审核人、时间和备注,并写入审计日志。
升级
在注册审核功能出现之前已有的账号,以及在自由注册模式下创建的账号,都直接视为正常账号。
升级器会新增 registration_application 表,并在权限列表末尾加入 ManageRegistrationReviews,原有取值和顺序不变。请使用升级器,不要手动替换文件或重启。
从第一个带注册审核的版本升级时,升级器会把旧的待审核和已拒绝账号转换为申请,保留密码哈希、时间和审核信息,并删除这些空账号。它会先在数据库副本上测试;如果其中有账号已有内容(提交、题目、讨论、权限或自定义资料),或用户名、邮箱冲突,升级会停止且不修改任何数据。已通过的账号保留原来的 ID。用户 ID 不会重复使用,因此 ID 之间可能有空缺。
完成这一迁移后,不要退回到没有申请功能的旧代码。如果升级在这一步失败,升级器可能会让网站保持停止以保护申请数据;请保留新数据,并按升级与恢复修复安装。
排错
- 菜单中没有“注册审核”: 确认账号是管理员或拥有审核权限,然后刷新页面。如果仍然显示旧页面,确认前端和后端都已升级。
- 后端报告缺少数据表: 查看升级日志中的数据库迁移部分。不要通过关闭 AppArmor、放宽目录权限或删除旧数据库来解决。