Registration Approval.zh CN - houyhlouis/LLMOJ GitHub Wiki

新用户注册审核

简体中文 | English | Wiki 首页

网站可以选择以下三种注册模式之一:

模式 registrationMode 有人注册时
自由注册 open(默认) 账号立即可用
管理员审核 approval 生成一份申请,审核通过后才能登录
关闭注册 closed 不能注册;已有账号照常登录和找回密码

切换模式不会影响已有账号,也不会自动通过待审核或已拒绝的申请。

选择注册模式

  1. 用站点管理员账号登录,在用户菜单中选择 网站管理(/site-management)。
  2. 选择注册模式并点击 保存。新模式从下一次请求起生效,无需重启;已经打开的注册页面刷新后即可看到。
  3. 如需改回服务器配置文件中的模式,点击 恢复服务器配置。

只有站点管理员可以修改注册模式;有审核权限或首页编辑权限的用户不能修改。

在这里保存的模式存放在数据库中,重启和升级后仍然有效,并且优先于 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,用户用注册时的密码登录。
  • 拒绝不会创建账号。已拒绝的申请之后仍可通过;已通过的申请不能再拒绝。
  • 如果用户名或邮箱在此期间已被占用,通过操作会失败,申请保持不变。解决冲突后再试。

备注只有审核者能看到。申请人登录时会看到申请正在审核或已被拒绝的提示。审核结果不会发送邮件。

待审核和已拒绝的申请会继续占用其用户名和邮箱。为了保留记录,不能重新申请或删除申请;也不要直接删除数据库中的行来绕过。

审核只决定谁能获得账号;游客原本能看到的页面仍然对游客可见。

让其他人审核

站点管理员始终可以审核。要让其他用户审核:

  1. 打开 权限管理(/permissions),选择该用户。
  2. 在 管理特权 中,把 管理注册审核(含拒绝后批准) 设为 允许,然后点击 保存权限。

审核者刷新页面后即可看到 注册审核,包括申请人的邮箱和备注。把该权限设为 拒绝 即可收回。管理用户或用户组的权限不包含审核权限;被禁止访问网站的用户也不能审核。

审核者不会因此成为管理员:不能修改权限,也不能修改管理员的资料或密码。

每次审核都会记录审核人、时间和备注,并写入审计日志。

升级

在注册审核功能出现之前已有的账号,以及在自由注册模式下创建的账号,都直接视为正常账号。

升级器会新增 registration_application 表,并在权限列表末尾加入 ManageRegistrationReviews,原有取值和顺序不变。请使用升级器,不要手动替换文件或重启。

从第一个带注册审核的版本升级时,升级器会把旧的待审核和已拒绝账号转换为申请,保留密码哈希、时间和审核信息,并删除这些空账号。它会先在数据库副本上测试;如果其中有账号已有内容(提交、题目、讨论、权限或自定义资料),或用户名、邮箱冲突,升级会停止且不修改任何数据。已通过的账号保留原来的 ID。用户 ID 不会重复使用,因此 ID 之间可能有空缺。

完成这一迁移后,不要退回到没有申请功能的旧代码。如果升级在这一步失败,升级器可能会让网站保持停止以保护申请数据;请保留新数据,并按升级与恢复修复安装。

排错

  • 菜单中没有“注册审核”: 确认账号是管理员或拥有审核权限,然后刷新页面。如果仍然显示旧页面,确认前端和后端都已升级。
  • 后端报告缺少数据表: 查看升级日志中的数据库迁移部分。不要通过关闭 AppArmor、放宽目录权限或删除旧数据库来解决。