权限管理
维护 PRIVILEGED 名单与打印指令清单的三条指令。
基本信息
| 指令 | 实现类 | 权限等级 | 作用 |
|---|---|---|---|
/opis_addpriv |
CommandAddPrivileged |
3 | 把玩家加入 PRIVILEGED 名单 |
/opis_rmpriv |
CommandRmPrivileged |
3 | 把玩家移出名单 |
/opis_help |
CommandHelp |
3 | 列出 13 条指令与说明 |
注册位置:modOpis.java:226、:227、:233(modOpis.java:233 在三条被注释掉的客户端指令之后)。
功能
双层权限模型
Opis 的权限判定不单靠 FML 的 getRequiredPermissionLevel(),而是两层:
- FML 权限层:
getRequiredPermissionLevel()返回 3 的指令共 10 条(/opis_stop、/opis_reset、/opis_delay、/opis_ticks、/opis_kill、/opis_killall、/opis_addpriv、/opis_rmpriv、/opis_enttrace、/opis_help)在标准canCommandSenderUseCommand里要求 OP 级 - 名单层:上列 10 条里有 9 条(除
/opis_help外)额外覆写了canCommandSenderUseCommand,逻辑一致:
if (sender instanceof EntityPlayerMP) return PlayerTracker.INSTANCE.isPrivileged((EntityPlayerMP) sender);
if (sender instanceof DedicatedServer) return true;
if (!(sender instanceof DedicatedServer) && !(sender instanceof EntityPlayerMP)) return true;
return false;
即服务端控制台恒放行;玩家必须先被加入 PRIVILEGED 名单。这让非 OP 的普通玩家也能管理自己的分析权限。唯一例外是 /opis_help,它的覆写内容是 return true(CommandHelp.java:39),不查名单。
而 /opis(CommandOpis)、/opis_start、/opis_te、/opis_ent、/opis_chunk、/opis_nent 六条的 canCommandSenderUseCommand 只 return true,完全不做名单校验;其中 /opis 另有一道 Message.COMMAND_OPEN_SWING 的 accessLevel 闸门。
/opis_addpriv <name>
CommandAddPrivileged.java:25-29:直接 PlayerTracker.INSTANCE.addPrivilegedPlayer(astring[0]),回复 Player %s added to Opis user list。不做存在性校验,astring[0] 不检查长度也没有 try/catch。
/opis_rmpriv <name>
CommandRmPrivileged.java:24-31:先 isInPrivilegedList(astring[0]) 判断:
- 在名单里:
rmPrivilegedPlayer后回复Player %s removed from Opis user list. - 不在名单里:回复
Player %s not found in list.
/opis_help
CommandHelp.java:24-32 硬编码 13 条指令,格式为 /<name> : <description>:
/opis_start、/opis_stop、/opis_reset、/opis_delay、/opis_ticks、/opis_chunk、/opis_te、/opis_ent、/opis_nent、/opis_kill、/opis_killall、/opis_addpriv、/opis_rmpriv
该列表与实际注册的 16 条指令不一致,缺少 3 条:/opis(面板入口)、/opis_enttrace(CommandEntityCreate 未实现 IOpisCommand,没有 getCommandNameOpis())、/opis_help(自身不列自己)。
/opis_help 自身覆写了 canCommandSenderUseCommand 返回 true(CommandHelp.java:38-40),但因为 getRequiredPermissionLevel() 是 3,标准 OP 判定仍会先拦下非 OP。
数值
| 数值名 | 值 |
|---|---|
| 三条指令的权限等级 | 3 |
/opis_help 输出的指令条数 |
13 |
| 实际注册的服务端指令总数 | 16 |
配置中的 ACCESS_RIGHTS:privileged 默认值 |
空数组 {} |
交互
| 触发 | 行为 |
|---|---|
服务端控制台 /opis_addpriv Steve |
Steve 成为已授权玩家 |
已授权玩家 /opis_addpriv Alex |
生效(名单层放行) |
未授权玩家 /opis_addpriv Alex |
被拒 |
/opis_rmpriv Steve(在名单) |
移出并确认 |
/opis_rmpriv Steve(不在名单) |
提示未找到 |
控制台 /opis_help |
输出 13 行 /名字 : 说明 |
相关条目
- config - 名单持久化与 accessLevel 的配置定义
- entity-tools - 同样受名单层保护的三条破坏性指令
- run-control - 权限等级 3 的启动/停止指令
- network-protocol - accessLevel 枚举与权限在封包层的对应关系