基于权限策略实现角色层级规则:禁止moderator封禁administrator账号
实现方案
步骤1:调整rank表结构,新增权重字段
给存储角色的rank表新增int类型的strength字段,设置为非空,默认值可以设为普通用户对应的权重数值。给现有角色按权限等级赋值:
- admin:1000
- moderator:800
- premium:200
- 普通user:100
预留足够的数值间隔,后续新增角色直接填入对应权重即可,不需要修改原有业务逻辑。
步骤2:改写Policy核心校验逻辑
把之前硬编码判断角色类型的逻辑,替换成权重对比即可,伪代码示例(不同框架写法通用):
// 封禁操作权限判断 function canBan(currentUser, targetUser) { // 获取当前操作者的角色权重 currentStrength = currentUser.rank.strength // 获取被操作目标的角色权重 targetStrength = targetUser.rank.strength // 仅当前操作者权重严格大于目标时允许操作,需要同权限可互操作就把>改成>= return currentStrength > targetStrength }
所有涉及权限高低判断的操作,都可以复用这套逻辑,后续新增角色只需要在rank表配置对应strength值即可。
步骤3:前端体验优化(可选)
前端渲染用户列表时,也可以用当前登录用户的权重和每行用户的角色权重对比,权重不满足要求时直接把ban按钮置灰或者隐藏,减少无效请求。
注意:前端校验仅做体验优化,后端的Policy校验绝对不能省略,防止有人绕过前端直接调用接口执行操作。
额外优化建议
权重数值尽量留足空白区间,比如1000到800之间空出200的差值,后续需要加super moderator这类中间等级角色时,直接填900即可,不需要调整原有角色的权重值。
内容的提问来源于stack exchange,提问作者Kylian
相关产品推荐
相关产品推荐

