dwgx@blog:~$dwgx
> cd ../posts

l2111pageloginverify:给 MC 私服写的本地登录验证插件

// created

l2111pageloginverify 是给 Paper 1.21 服务端写的本地登录验证插件。跟朋友开的私服上用,不接第三方账号系统,不挂外部认证,账号密码全跑在本地,数据留在自己手里。

MC 服务端没有原生输入 UI,常见做法是让玩家在聊天里打 /login 密码,明文直接飘在聊天框。这插件改用成书(signed book):玩家进服先被锁住,塞一本验证书,填账号密码签名,签完自动注册或登录。签过的书不可编辑、不留草稿,聊天框保持干净。验证通过前玩家全程冻结,移动、交互、聊天、指令、背包、受伤全拦掉。背包满了要腾位置就先把物品安全暂存,验证完原样还回,NBT、附魔、耐久都保留。

用户数据落在 users.yml,密码支持明文和 PBKDF2 哈希两种模式,运行时用 /dwgxverify encryption <true|false> 切换,数据分区存 data.hasheddata.plain,互不污染。每次登录写一份记录进 logs.yml,带 IP、时间和单独的盐。另外有登录限速、输入长度上限、超时没签完就踢,以及管理员审核模式——开了之后注册要 /dwgxverify approve 才放行。

命令行管起来麻烦,顺手加了个本地 Web 面板,默认监听 http://127.0.0.1:1337,只绑本机。能看用户列表、搜索分页、审核、处理重置、切配置。坚持零外部依赖,页面纯 Java 拼出来,不带 HTML,插件扔进 plugins/ 就能用。面板走 Basic Auth,默认密码 change-me,上线前记得改。

Java 21、Gradle 8.8 构建,用 run-paper 本地起 1.21 测试服调试。paper-api 版本 1.21.11-R0.1-SNAPSHOT,当前 1.0-SNAPSHOT,自己在用随手改。