V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bestmos
V2EX  ›  问与答

RBAC 模型下,分级的权限有什么较好的设计方案吗

  •  
  •   bestmos · 2023-05-18 13:25:39 +08:00 · 1556 次点击
    这是一个创建于 589 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司有销售部、人事部、财务部,以销售部为例。

    销售部(角色:总经理-经理-主管-员工),每个角色都有增删改查权限

    上级可以操作自身下级的,到员工这一级因为没有下级,就只能操作自身

    未命名文件

    方案一

    给用户加上父 ID ,操作时判断 被操作对象的父 ID 是否属于 操作人 ID 的子集

    弊端:1 、背离部门分离原则 2 、后续无法新增角色

    方案二

    给角色增加 level 标识,操作时判断 操作人的角色 level 是否大于 被操作对象的角色 level

    弊端:后续新增角色依旧不方便

    这两个感觉都不咋行,不知道还有啥方案吗

    第 1 条附言  ·  2023-05-18 17:46:59 +08:00
    内容描述不够完整,具体的需求就是控制某一级的角色只能操作自身和下级,而不能操作同级和上级角色。
    比如 QQ 群的踢人,群主可以踢所有人,管理员只能踢普通群员而不能踢群主和其他管理员,普通群员则只能踢自己(退群)
    10 条回复    2023-05-18 18:54:30 +08:00
    hxndg
        1
    hxndg  
       2023-05-18 14:48:26 +08:00
    这个听起来像是 rbac 不能充分的表达角色?最根本的解决还是说该拆分为
    运营总经理,运营经理,运营主管,运营员工
    开发总经理,开发经理,开发主管,开发员工

    然后开发总经理能增删改查剩下三个,开发经理增删改查剩下两个

    如果实现不了的话,在 rbac 的基础上加上基于 attr 的校验?这里的 attr 是指需要校验属性是否相匹配啥的,比方说总经理增删改查只能影响同部门( attr )的员工?
    bestmos
        2
    bestmos  
    OP
       2023-05-18 14:52:02 +08:00
    @hxndg #1 对,增删改查只能影响同部门。然后上级到下级权限是一致的,只是作用范围的递减,到最底层的用户时,就只能修改自己了。想不到什么比较优雅的方案完成这个作用范围的划分
    wu67
        3
    wu67  
       2023-05-18 15:14:16 +08:00
    拆分权限粒度到每个接口, 或者说时每个‘接口模块’.
    每个角色拥有特定的模块权限.

    但是按照国情传统, 用不着多久就会出现有人想要跨级操作的场景了...例如总经历不想干活只想干秘书, 但是又不想把账号给下属经理, 然后下属经理来找你让你给他总经历的操作权限...
    这时候给他指定一个特定角色, 权限在管理后台给他全手工勾选算了...
    bestmos
        4
    bestmos  
    OP
       2023-05-18 15:18:29 +08:00
    @wu67 #3 现在就是这样干的,但是存在情况,总经理有修改权限,员工也有修改权限,如果不限制员工权限的作用范围的话,就存在跨级操作了(员工可以修改总经理信息)
    wu67
        5
    wu67  
       2023-05-18 15:29:12 +08:00
    @bestmos 这样不是很合理吧.
    个人觉得用户信息模块应该独立对待, 仅限本人和 admin 修改,
    其他的业务信息模块才允许那些特殊跨级角色和正常角色修改.
    因为从上面的描述来看, 总经理撂挑子撂的不正是‘业务’吗? 他没把自己职位(‘用户信息’)让出去, 所以用户信息这模块应该是特殊的才对.
    bestmos
        6
    bestmos  
    OP
       2023-05-18 15:45:43 +08:00
    @wu67 #5 你说的是合理的,我开始也是这个想法,但是不合现实。
    比如有个场景:老年用户不会自己修改信息,所以由对接他的客户经理(上级)帮助修改。
    hanpeng1986
        7
    hanpeng1986  
       2023-05-18 17:13:35 +08:00   ❤️ 1
    这个场景像是需要做数据权限的控制吧?
    我们之前做的类似方案一,不过是把一个“授权”的动作给显性化了,上级可以操作下级的数据就是下级“授权”上级操作我自己的数据,所以搞了一套授权系统,操作的时候需要根据授权表做额外判断
    1. 授权系统本质上就是一套权限关系表加上几个脚本,开始是几个脚本定时同步组织架构,把上下级关系或者部门角色关系带来的一些默认的授权动作自动化跑到授权表里,后来有些时效性问题就改成事件监听组织架构变更了。
    2. 另外因为公司恰好有一套接了审批流的授权系统,所以直接套了个壳做了个页面,给业务自己来做组织架构情况以外的各种授权规则

    这样的好处就是兼容各种特殊情况,谁谁请假了要同事帮忙操作的,某个领导要同时兼着两个部门的活但组织架构又不调等等,发个授权申请审批后就能操作了。
    坏处就是权限管理非常混乱,权限关系理不清,出了事情各种排查追溯到底咋回事,费时费力
    bestmos
        8
    bestmos  
    OP
       2023-05-18 17:46:16 +08:00
    内容描述不够完整,具体的需求就是控制某一级的角色只能操作自身和下级,而不能操作同级和上级角色。
    比如 QQ 群的踢人,群主可以踢所有人,管理员只能踢普通群员而不能踢群主和其他管理员,普通群员则只能踢自己(退群)
    lzxz1234
        10
    lzxz1234  
       2023-05-18 18:54:30 +08:00   ❤️ 1
    数据权限可以在 RBAC 的基础上单列,RBAC 只需要实现到操作的权限
    给所有人划分组织树和权限树,可以合并也可以拆分,在这实现上下级数据权限
    拆分的好处是 张三可能是个基层管工,但是数据权限上拉,可以负责整个大部门的某个单项管理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   929 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 21:21 · PVG 05:21 · LAX 13:21 · JFK 16:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.