🔐 权限设计理念¶
KaMenu 采用极简的权限设计理念,仅保留核心管理权限,将所有访问控制交给配置系统灵活实现。
💡 设计理念¶
为什么只有一个权限?¶
KaMenu 相信配置大于权限的设计理念。与其使用繁琐的权限节点来控制菜单访问,不如通过灵活的配置系统实现更精细、更直观的访问控制。
核心原则:
- 权限系统:仅用于插件管理操作(如重载配置)
- 配置系统:用于所有菜单访问控制(指令、物品、条件判断)
为什么这样设计?¶
传统的权限系统问题¶
问题:
- 权限节点数量较多,难以管理
- 权限与菜单文件分离,配置分散
- 需要记忆大量权限节点名称
- 无法实现复杂的条件访问控制
KaMenu 的配置驱动设计¶
我们可以在菜单内添加开启动作,判断玩家是否符合条件。
# 通过条件判断实现访问控制
Events:
open:
actions:
- condition: 'hasPerm.user.vip'
allow:
- 'tell: 你有 user.vip 权限,允许打开此菜单。' # 允许打开菜单
deny:
- 'tell: &c你没有 user.vip 权限,无法打开此菜单'
- 'cancel' # 阻止打开菜单
优势:
- 所有访问控制逻辑集中在菜单文件中
- 支持复杂的多条件判断
- 无需配置权限节点,简化管理
- 更直观、更灵活
📋 权限一览¶
| 权限节点 | 说明 | 默认拥有者 |
|---|---|---|
kamenu.admin |
允许执行管理操作(如重载配置) | 仅 OP |
🔧 kamenu.admin 权限¶
功能说明¶
允许服务器管理员执行插件管理操作:
- 允许执行
/kamenu所有的指令
默认状态: 仅 OP 拥有此权限
🎯 访问控制的灵活实现¶
KaMenu 通过多种配置方式实现菜单访问控制,无需依赖权限系统。
1. 自定义指令 - 谁可以使用指令打开菜单?¶
通过 config.yml 中的 custom-commands 注册自定义指令,默认所有玩家都可以使用。
2. 监听器 - 谁可以通过物品/按键打开菜单?¶
通过 config.yml 中的监听器配置,自动触发菜单打开。
listeners:
# 副手键触发
swap-hand:
enabled: true
menu: 'main_menu'
require-sneaking: true # 需要 Shift + F
# 右键物品触发
item-lore:
main-menu:
enabled: true
material: 'CLOCK'
target-lore: '菜单'
menu: 'main_menu'
require-sneaking: false
默认行为:
- 所有持有对应物品或按对应按键的玩家都会触发
3. Events.open 条件 - 谁可以打开菜单?¶
通过菜单文件中的 Events.open 配置,实现精细的访问控制。
基础示例:权限检查¶
Events:
open:
actions:
- condition: 'hasPerm.kamenu.vip'
allow:
- 'tell: &a你有 kamenu.vip 权限,允许打开菜单。' # 继续打开菜单
deny:
- 'tell: &c你需要 kamenu.vip 权限才能访问此菜单'
- 'return' # 阻止打开菜单
进阶示例:多条件判断¶
Events:
open:
actions:
# 检查多个条件
- condition: 'hasPerm.kamenu.vip && %vault_eco_balance% >= 100'
allow:
- 'tell: &a你有 kamenu.vip 权限和 100 金币,允许打开菜单。'
deny:
- 'tell: &c你需要 kamenu.vip 权限和 100 金币才能访问此菜单'
- 'return'
📝 对比总结¶
传统权限系统 vs KaMenu 配置驱动¶
| 特性 | 传统权限系统 | KaMenu 配置驱动 |
|---|---|---|
| 权限节点数量 | 大量(几十个) | 极少(仅 1 个) |
| 配置位置 | 分散(权限插件 + 插件配置) | 集中(菜单文件) |
| 条件判断 | 不支持复杂条件 | 支持任意复杂条件 |
| 灵活性 | 低 | 高 |
| 学习成本 | 需要记忆大量权限节点 | 配置直观易懂 |
| 维护成本 | 高(修改权限需多处配置) | 低(配置集中) |