数据库设计:RBAC还是ABAC?

7
我有一个SaaS服务,多个用户可以协作。之前,同一订阅账户下的用户可以共享同一个数据库,并且可以互相查看/编辑/删除其中的所有内容。
现在,我想要实现一个权限系统,使得用户只能进行特定操作,例如查看、编辑、更新和删除内容(在我的SaaS系统中,内容主要是客户卡片列表)。
我的第一个想法是使用RBAC技术,定义角色和不同操作的位掩码,例如:
- 查看客户卡片 - 更新客户卡片 - 删除客户卡片 - 添加客户卡片
这些权限与单个卡片实例无关,而是通用的用户可以执行的操作。其中第一个(查看)似乎是必需的,因为没有能够查看任何卡片就无法使用该系统。
不幸的是,我认为我还需要某种每张卡片的权限。例如,管理员用户可能希望让给定用户仅查看卡片的子集,而不是所有卡片。或者管理员用户可能允许一组用户在特定卡片(或特定卡片)上进行协作,从而将卡片列表分区成多个用户。无论哪种情况,我从未遇到过非管理员用户可以为自己或其他用户设置此类权限的情况。
RBAC足以表达这种需求吗?还是我需要切换到ABAC?
1个回答

7

经验法则如下:

  • 如果您在授权要求中有关系,则使用ABAC。

让我解释一下。使用RBAC,您可以定义角色、角色层次结构和权限。您还可以做一些静态分离职责的工作。例如,用户可以被赋予经理和高级经理的角色。这样,作为一个整体,他们就有权查看客户记录。到目前为止都很好。

但是...如果您需要说出以下内容:

  • 您只能查看您所在地区的客户信息
  • 您不能查看与您有个人(父子)关系的客户

那么您需要的不仅仅是RBAC。您需要像您指出的那样。ABAC并不完全替换RBAC。您仍然需要用户、用户元数据(如角色)和从角色到权限的分配。然而,这些分配不会通过角色管理工具来完成,而是在策略中进行。

中,这是政策的样子:
policy clientAccess{
    target 
           clause action.name == "view"
           object.Type == "client record"
    apply firstApplicable
    rule managersCanViewAll{
        target clause user.role == "manager"
        permit
    }
    rule employeeCanViewSameState{
        target clause user.role == "employee"
        permit
        condition user.state == client.state
    }
}

这个语句 condition user.state == client.state 是ABAC的秘密配方。
当然,ABAC还有其他好处,例如:
  • 更易于增长和发展
  • 更易于审计
  • 在应用程序和API之间更易于重复使用...
请查看以下资源以获取更多信息:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接