权限模型中的 基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)这两种怎么结合一起使用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Misty99
V2EX    Java

权限模型中的 基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)这两种怎么结合一起使用

  •  
  •   Misty99 171 天前 3325 次点击
    这是一个创建于 171 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们 这两种权限模型 一般什么业务场景下 会需要一起结合使用 ABAC 我的理解就是基于用户相关的一些信息属性进行控制的

    18 条回复    2025-04-24 12:23:42 +08:00
    kingcanfish
        1
    kingcanfish  
       171 天前
    很典型的 各种在线文档的读写权限, 比如 文档的作者拥有刻度可写权限可复制权限, 同部门的人可读可写, 部门外的人可读, 某一个群里的人可读可写, 北京的人可读可写
    怎么样的设计才是最佳的设计
    leokun
        2
    leokun  
       171 天前
    设计一个结构,存储的内容是 [user 是否拥有资源 ID 的增,删,改,查]
    基于角色或者基于属性或者基于业务,最终都转译为这个 map
    对权限内场景正常展示或者执行,对无无权限场景,则需要根据资源类型设计一些 failback 来处理容错
    例如抛出异常,禁止展示,逻辑分支,字符遮盖等都是对无权展示时候的容错处理
    leokun
        3
    leokun  
       171 天前
    @leokun 所以写代码的时候,我是统一管理两个地方
    一个是根据用户的角色属性等,实时计算出一个 [user 是否拥有资源 ID 的增,删,改,查]的 map
    另一个是根据资源类型+访问类型不通过的 failbacks
    dimwoodxi27
        4
    dimwoodxi27  
       171 天前
    系统权限存在总公司 分公司和多级部门和不同岗位的角色划分,就要用到 RBAC+ABAC(可能存在权限继承的关系)
    siaronwang
        5
    siaronwang  
       171 天前
    rebac
    meshell
        6
    meshell  
       171 天前
    插个眼,目前正在做这块只做了个 rabc ,部门的权限这个也没有想好杂弄。一批人都在一个部门,不代表他就能看部门的所有数据,有可能只有领导可以看。或者只开放了几个人看。上级的也不能看他下级的所有。
    COOOOOOde
        7
    COOOOOOde  
       171 天前
    抄作业. 我是之前啊想要白嫖微软的 todo api 和语音生成 api 了解到微软那一套权限认证的, 感觉他们设计得还蛮合理的
    whoosy
        8
    whoosy  
       171 天前   1
    做过云平台的一般都有类似的设计经验吧,比如阿里云控制台,总的来讲,大体上分为 3 种,功能权限,数据权限,字段权限。

    比如说:
    - 功能权限可定义开发角色可以启动虚拟机( RBAC )
    - 数据权限可限制你能够看到那些地域的虚拟机( ABAC )
    - 字段权限允许你能够访问的详细字段信息,如客户成本等 (FBAC)


    从我个人经验来讲,有几点建议
    1.数据权限一定要下沉到业务里面去做,而且不能设计的太过于灵活,否则后面一定会演化成性能的负担。
    2.基于组织架构的数据权限控制是良好的设计。
    3.数据权限应尽量通过数据库谓词下推(如 WHERE 子句)实现,避免内存中过滤。
    4.优先使用静态可枚举规则,动态规则需配套缓存和索引优化。
    cheng6563
        9
    cheng6563  
       171 天前
    给资源加 tag ,如["/部门/开发 2 部","/角色/部门领导","/用户/34234"]
    xaxb
        10
    xaxb  
       171 天前
    角色是一堆属性的集合{'/usr/add', '/usr/delete', ...}, 不同角色和属性取下并集,RoleA U RoleB U {attr1, attr2, ...}, 每个请求调用前验证当前会话是否拥有该权限(属性)@Auth("attr1")
    Kevin2
        11
    Kevin2  
       171 天前
    见过一个框架使用的方案就是两种混合使用:
    角色优先,对每个角色分配权限,用户关联各种角色;但是某些特殊用户去自定义分配特殊的权限 + 已有的角色权限;
    taoche
        12
    taoche  
       171 天前
    虽然我没有用过 https://casbin.org/zh/ 但是我从 casbin 对权限的设计上学习到了

    ```
    [matchers]
    m = g(r.sub, "admin") || (r.role == "user" && r.time.Hour >= 9 && r.time.Hour <= 18)
    ```
    zhangrandl
        13
    zhangrandl  
       171 天前
    这块可以参照云平台的权限设计,PBAC ,基于某些策略+字段动态控制权限,我刚研究明白,正在给我们自己平台重构,跟以往 RBAC 权限完全不一样,这个东西更像是一个动态策略
    epiloguess
        14
    epiloguess  
       171 天前
    参考一下 tailscale 的 acl 文档 https://tailscale.com/kb/1018/acls
    xuanbg
        15
    xuanbg  
       171 天前
    RBAC 模型是比较简单的,其他模型都很复杂,不好实现还是其次,问题是真的难用。

    其实说白了,权限就是功能权限+数据权限。RBAC 可以很好的解决功能权限的问题,但对于数据权限则无能为力。以我的经验,数据权限最终还是要落实到业务规则上,需要应用数据权限的业务,就要单独给设计一套数据权限的规则。这个规则以最低限度满足应用需求为限,千万不要过度设计。
    xuanbg
        16
    xuanbg  
       171 天前
    因为数据权限和业务数据是强耦合的关系,所以理论上是不可能实现抽象的。通用数据权限就是个永动机,理论上就不可能实现。想做通用数据权限规则的话,还请早点歇了这个心思。
    sampeng
        17
    sampeng  
       169 天前 via iPhone
    @xuanbg 参考 aws/阿里云的策略模型。就是个通用数据权限模型,abac+rbac 都是覆盖的…
    xuanbg
        18
    xuanbg  
       169 天前
    @sampeng 正如低代码实现复杂业务,不是实现不了,而是极难实现且实现出来极难用。有这功夫,再写业务代码的时候写个相应的数据权限规则就简单得多,而且配置规则也能做到非常简单高效。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3714 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:18 PVG 18:18 LAX 03:18 JFK 06:18
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86