V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ginakira
V2EX  ›  程序员

请教一下权限控制的最佳实践

  •  1
     
  •   ginakira ·
    Ginakira · 156 天前 · 3322 次点击
    这是一个创建于 156 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想请教一下各位 V 友,最近在学习 Golang ,写一个小项目的时候在权限控制上遇到了一些疑问。 背景如下:

    1. 用户可以属于多个组;
    2. 每个组都有固定切相同的角色,用户在一个组中可以拥有多个角色;
    3. 每个资源仅属于一个组;
    4. 组内的角色对组内的资源有不同的访问权限;

    诚心求问这样的需求应该选用什么权限控制模型? Go 下除了 Casbin 外有什么推荐的权限控制库吗?

    16 条回复    2024-07-02 16:48:21 +08:00
    hezhiming1993
        1
    hezhiming1993  
       156 天前   ❤️ 1
    RBAC
    kaneg
        2
    kaneg  
       156 天前   ❤️ 1
    需要控制访问资源的范围吗?比如甲乙属于一个组,但甲只能可以看自己组里面的内容,乙可以看所有组的。如果是这样的话,单纯的 RBAC 就不够了,需要在其基础上再加上对资源范围的控制。
    ginakira
        3
    ginakira  
    OP
       156 天前
    @kaneg 感谢解答。需要的是:对应组的资源只有拥有对应组对应角色的用户才可以访问,比如甲只有在有 A 组查看角色的条件下才能查看 A 组资源。这种情况 RBAC 是否适用呢?
    nx6Ta67v2A43frV2
        4
    nx6Ta67v2A43frV2  
       156 天前   ❤️ 1
    自己基于 RBAC 模型实现
    czk1997
        5
    czk1997  
       156 天前   ❤️ 2
    @ginakira 组中组嘛。
    不像自己实现可以参考用基于 google zanzibar 的。现成框架一大堆的,很多都是平台无关。
    权限控制本质就是构建 dag ,然后看两种资源之间是否可以联通。
    afxcn
        6
    afxcn  
       155 天前   ❤️ 2
    无论你是用组来限定资源权限还是用角色,最终都会回到具体的用户的权限。

    用组:用户 -> 组 -> 角色 -> 权限

    用角色:用户 -> 角色 -> 权限

    只是需要查询多一些而已
    HashV2
        7
    HashV2  
       155 天前   ❤️ 1
    直接找个 RCBA 的架子用就完事了
    coderzhangsan
        8
    coderzhangsan  
       155 天前   ❤️ 2
    按照权限设计理论,RBAC 属于垂直权限,数据资源控制属于水平权限,二者相互独立;一般情况下垂直权限是必须要具备的,至于水平权限,如果有数据资源控制,则需要在垂直权限的基础上二次设计。
    ginakira
        9
    ginakira  
    OP
       155 天前
    @czk1997
    @afxcn
    @HashV2
    @coderzhangsan 感谢几位的解答,受教了。
    Nazz
        10
    Nazz  
       155 天前   ❤️ 1
    推荐自己写
    NoKey
        11
    NoKey  
       155 天前   ❤️ 1
    所有权限,基于组去查询就可以了,还是有角色,但是角色是隶属于某个组的
    比如你把角色 Ra 分给用户 UserA ,分的时候,要确定是那个组,那么形成 组-角色-人员 这样一个关联关系
    所有操作,都居于这个层次关系去约束
    ginakira
        12
    ginakira  
    OP
       155 天前
    @NoKey 感谢解答。
    hxndg
        13
    hxndg  
       154 天前
    真实的生产往往不是光 RBAC ,都是组合考虑的。
    如果走单纯的 RBAC 你这个里面我目前可以明确看到有个问题是组一多就角色膨胀了
    另外就是资源只属于一个组这个假设不确定是否稳固
    所以建议 RBAC + ABAC 控制,通用角色用 RBAC ,组用 ABAC 控制
    ginakira
        14
    ginakira  
    OP
       154 天前
    @hxndg 感谢指教!目前的设计是与 11# 所说的类似,基于 “人员-组-角色” 的关联关系来约束,看起来有些像 RBAC with domain ,不知道这样设计是否妥当。还有对于您提到的 RBAC+ABAC 控制不确定我的理解是否正确,比如对于一次需要鉴权的操作,先使用 ABAC 控制用户所在的组是否与资源所属的组一致,再使用 RBAC 根据用户的角色来控制用户能否对资源执行此次操作吗?
    hxndg
        15
    hxndg  
       154 天前
    @ginakira
    @NoKey 我不是很确定 11 的具体含义,读起来觉得组不是属性,而是一个实体,感觉会造成真实的角色是组*角色的膨胀
    关于第二个问题,
    是的
    我说的 R+A BAC 里面,角色和对象是实体,组属于属性
    ginakira
        16
    ginakira  
    OP
       154 天前
    @hxndg 是的,目前组确实是实体。目前的关联关系不是通过创建 (组*角色) 的角色实体再与用户关联的,而是直接用 (用户,组,角色) 这样的三元组关联起来的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:56 · PVG 00:56 · LAX 08:56 · JFK 11:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.