使用CBAC与RBAC的主要好处是什么?什么时候使用CBAC更好,什么时候使用RBAC更好?

我试图理解CBAC模型的一般概念,但总体思想对我来说仍然不清楚。


当前回答

还可以以声明的方式管理角色。

与其创建反映业务角色的授权角色,不如创建反映操作角色的角色,例如CreateCustomer、EditCustomer、DeleteCustomer。根据需要注释方法。

将个人映射到一组动作角色并不是一件简单的事情,特别是当角色列表变得越来越大时。因此,您需要在较低的粒度级别上管理业务角色(例如销售、市场营销),并将业务角色映射到所需的操作角色。例如,将用户添加到业务角色,并将其映射到现有授权表中所需的(操作)角色。

您甚至可以覆盖业务角色,并直接将人员添加到操作角色。

因为构建在已经工作的基础上,所以不会撤销现有的授权流程。您只需要几个表就可以实现这种方法

其他回答

到目前为止,我已经实现了许多次安全模型,也不得不把我的脑袋绕在这些概念上。做过很多次,以下是我对这些概念的理解。

什么是角色

角色=用户和权限的并集。

一方面,Role是权限的集合。我喜欢称它为权限配置文件。当定义一个角色时,你基本上是在这个角色中添加了一堆权限,所以从这个意义上说,一个角色就是一个权限配置文件。

另一方面,Role也是用户的集合。如果我将Bob和Alice添加到角色“经理”中,那么“经理”现在包含两个用户的集合,有点像一个组。

事实上,角色既是用户的集合,也是权限的集合。从视觉上看,这可以看作是一个维恩图。

什么是组

组=用户的集合

“组”严格来说是用户的集合。组和角色的区别在于角色也有权限集合,而组只有用户集合。

什么是权限

权限=一个主体可以做什么

什么是权限集

权限集=权限的集合

在一个健壮的RBAC系统中,权限也可以像用户一样分组。“组”只是“用户”的集合,而“权限集”只是“权限”的集合。这允许管理员一次将整个权限集合添加到角色。

用户、组、角色和权限如何组合在一起

在健壮的RBAC系统中,可以将用户单独添加到角色中以创建角色中的用户集合,也可以将组添加到角色中以一次将用户集合添加到角色中。无论哪种方式,角色通过单独添加或向角色添加组或向角色添加用户和组的组合来获得用户集合。可以以同样的方式考虑权限。

可以将权限单独添加到角色中以创建角色内部的权限集合,或者可以将权限集添加到角色中。最后,可以将权限和权限集混合添加到角色中。无论采用哪种方式,角色都可以通过单独添加或向角色添加权限集来获得权限集合。

角色的全部目的是将用户与权限结合起来。Role是Users和Permissions的UNION。

什么是索赔

Claim =主语是什么

声明不是权限。正如前面的回答所指出的,Claim是主体“是”的,而不是主体“能做”的。

声明不会取代角色或权限,它们是可用于做出授权决策的附加信息。

何时使用索赔

我发现当需要做出授权决策时,当用户不能添加到角色或决策不是基于用户与权限的关联时,声明是有用的。Facebook用户的例子导致了这一点。Facebook用户可能不是被添加到“角色”的人……他们只是通过Facebook认证的访问者。尽管它不完全适合RBAC,但它是一个用于做出授权决策的信息。

@CodingSoft used the night club metaphor in a previous answer, which I'd like to extend. In that answer, the Driver's License was used as an example that contained a set of Claims where the Date of Birth represents one of the Claims and the value of the DateOfBirth Claim is used to test against the authorization rule. The government that issued the Driver's License is the authority that gives the Claim authenticity. Therefore, in a night club scenario, the bouncer at the door looks at the the person's Driver's License, ensures that it was issued by a trusted authority by examining whether or not it is a fake ID (i.e. must be valid government issued ID), then looks at the Date of Birth (one of the many claims on a Driver's License), then uses that value to determine if the person is old enough to enter the club. If so, the person passes the authorization rule by virtue of having a valid Claim, not by being in some Role.

现在,有了这个基础,我想进一步扩展。假设夜总会所在的建筑包含办公室、房间、厨房、其他楼层、电梯、地下室等,只有俱乐部的员工才能进入。此外,某些员工可能可以进入其他员工无法进入的某些地方。例如,经理可以访问其他员工无法访问的办公楼层。在本例中,有两个role。经理和员工。

正如上面所解释的那样,访客进入公共夜总会区域的权限由单一声明授权,但员工需要通过Role进入其他非公共限制房间。对他们来说,只有驾照是不够的。他们需要的是一个员工卡,他们扫描进门。在某个地方,有一个RBAC系统授予经理角色中的徽章进入顶层的权限,以及员工角色中的徽章进入其他房间的权限。

如果出于某种原因,Role需要添加/删除某些房间,可以使用RBAC来完成,但它不适合Claim。

软件中的权限

Coding Roles into the application is a bad idea. This hard codes the purpose of the Role into the application. What the application should have is just Permissions that act like Feature Flags. Where Feature Flags are made accessible by configuration, Permissions are made accessible by the User Security Context that is derived by the DISTINCT collection of Permissions gathered from all Roles the User has been placed in. This is what I call the "Effective Permissions." The application should only present a menu of possible Permissions to features / actions. The RBAC system should do the job of marrying those Permissions to Users through Roles. This way, there is no hard coding of Roles and the only time a Permission changes is when it is removed or a new one is added. Once a Permission is added to the software it should never be changed. It should only be removed when necessary (i.e. when a feature is discontinued in a new version) and only new ones can be added.

最后一点。

Grant vs Deny

一个健壮的RBAC系统甚至CBAC系统都应该区分grant和deny。

向角色添加权限应该带有GRANT或DENY。勾选“权限”后,所有授予的权限都应添加到“有效权限”的“用户”列表中。然后,在所有这些完成后,一个DENIED Permissions列表应该会导致系统从Effective Permissions列表中删除这些Permissions。

这允许管理员“调整”主题的最终权限。如果权限也可以直接添加到用户,那就最好了。通过这种方式,您可以将用户添加到经理角色,他们可以访问所有内容,但可能您希望拒绝访问女厕所,因为用户是男性。因此,您将男性用户添加到经理角色,并使用DENY向User对象添加权限,这样它只会剥夺女士的房间访问权。

实际上,这将是Claim的一个很好的候选者。如果用户有一个声明“性别=男性”,那么在经理角色中可以访问所有房间,但女厕所也要求声明性别=女性,男厕所要求声明性别=男性。通过这种方式,不必为男性用户配置DENY权限,因为Claim实施将使用单个授权规则为每个人配置DENY权限。然而,这两种方法都可以。

关键是使用拒绝权限,可以更容易地管理角色,因为可以实现异常。

下面是我很久以前制作的RBAC模型的图表。我没有声明的图表,但你可以想象它们只是附加到用户的属性,无论它们在哪里。此外,该图没有显示Groups(我需要在某个时候更新它)。

这是上面描述的RBAC的示意图

2019年4月7日更新 根据@Brent的反馈(谢谢)…删除了对之前答案的不必要引用,并解释了@CodingSoft提供的“夜总会”比喻的原始基础,以便使这个答案可以理解,而不必阅读其他答案。

另一个可以考虑的选项是ABAC。

基于属性的访问控制采用了一种不同的方法,它根据每个用户的属性、他们请求的资源以及他们发出请求的环境向用户授予访问权。

ABAC的主要好处是可以对每个用户的权限进行细粒度控制。例如,使用ABAC,您可以为人力资源应用程序的用户授予仅为他们负责的区域导出人员报告的权限。因为模型被设计成可以扩展到任意数量的属性和权限,所以在ABAC中构建更动态的权限通常更容易。

这里的好文章总结了差异https://cerbos.dev/blog/the-hidden-costs-of-user-authorization

还可以以声明的方式管理角色。

与其创建反映业务角色的授权角色,不如创建反映操作角色的角色,例如CreateCustomer、EditCustomer、DeleteCustomer。根据需要注释方法。

将个人映射到一组动作角色并不是一件简单的事情,特别是当角色列表变得越来越大时。因此,您需要在较低的粒度级别上管理业务角色(例如销售、市场营销),并将业务角色映射到所需的操作角色。例如,将用户添加到业务角色,并将其映射到现有授权表中所需的(操作)角色。

您甚至可以覆盖业务角色,并直接将人员添加到操作角色。

因为构建在已经工作的基础上,所以不会撤销现有的授权流程。您只需要几个表就可以实现这种方法

如果你想要一个真实的例子;

你有一个学校系统,老师可以登录并看到他们的学生。这些老师属于“老师”角色。但我们不希望所有的老师看到所有的学生,所以我们需要区分同一水平的人与他们的主张。

玛丽-数学老师(声称:数学)->只能看到数学学生 约翰-物理老师(声称:物理)->只能看到物理学生 亚当-物理和化学老师(声称:物理,化学)->可以看到物理和化学的学生。

虽然这三位老师都在教师角色下,但他们只能看到学生的相应要求。

有一个叫迈克的校长

Mike -校长(角色:管理员,索赔:n/a) ->可以看到和管理所有学生,因为他是管理员角色,无论他没有任何索赔。

如果我们需要区分管理员级别的人员,我们可以将相关的声明分配给每个人。

我认为这个问题可以从数据库的角度来回答。 如果您注意到表是如何参与这个植入的,您将发现以下内容

AspNetUsers : each user has one row with all the attributes required by all users like email, address phone, password..... AspNetRoles ; defines different roles as per application requirements like GM , CTO, HRM,ADMIN, EMP. what each roles defines is as per application needs. AspNetUserRoles: each row links AspNetUsers and AspNetRoles and effectively links between one user and many roles. AspNetUserClaims: each row has key to AspNetUsers and one type and value. so effectively add one attribute for each user that could be added/removed at run time.

这个表的使用可以在用户/应用程序生命周期的某个时刻进行调整,以匹配特定的需求。

考虑到“采购经理”(PM)的早期阶段,我们可以有三种方法

Application populates AspNetUserRoles with one row to grants 'PM' right to buy. To issue purchasing order with any amount, user only need "PM" role. Application populates AspNetUserRoles with one row to grants 'PM' right to buy, and populates the AspNetUserClaims a claim of TYPE 'Purchasing Amount' type and "<1000" value to set the amount limit. To issue purchasing order, user need to has 'PM'and the order amount be less than claim value of claim TYPE 'Purchasing Amount'. Application populate AspNetUserClaims with claim of TYPE 'Purchasing Amount' type and "<1000" value. Any user can issue purchasing order, given the the amount to be less than claim value of claim TYPE 'Purchasing Amount' for this user.

可以注意到,基于角色的是粗粒度的刚性权限,从系统管理的角度来看,这将简化应用程序用户的生活。然而,从业务需求的角度来看,这将限制用户的能力。 另一方面,基于索赔的是非常精细的权利,需要分配给每个用户。以索赔为基础会把业务推到极限,但会使系统管理非常复杂。