5

我们目前正在我们的 Web 应用程序 (ASP.NET) 中设计一个用户角色和权限系统,似乎我们有几个案例适合经典的基于角色的访问控制 (RBAC)。我将发布几个问题,每个问题都针对特定案例。这是我的第二个问题(第一个问题在这里:非 RBAC 用户角色和权限系统:检查用户的城市)。

我们有以下情况:我们需要在我们的 Web 应用程序中实现一个Manager 角色。但是,经理可以属于一个或多个公司(在我们为其创建此 Web 应用程序的一大群公司中)。比如说,可以有“A 公司和 B 公司的经理”、“C 公司的经理”等。

根据经理所属的公司,他可以访问某些操作:例如,他只能与他所属公司的客户进行通信。即“A、B公司经理”只能与A、B公司的客户联系,不能与C公司的客户联系。他还可以查看A、B公司的客户详情页面,不能查看C公司的客户详情页面等。 .

此案似乎属于 RBAC。然而,事实并非如此。我们需要创建一个拥有Companies 属性的ManagerRole 类——也就是说,这不仅仅是一个作为权限集合的角色(如在经典 RBAC 中),而是一个具有属性的角色

这只是具有属性的角色的一个示例。还会有其他角色:例如,管理员角色也将属于许多公司,并且还将具有其他自定义属性。

这意味着我们将有一个层次结构或角色类:


class Role – base class  
class ManagerRole : Role  
    List Companies  
class AdministratorRole : Role  
    List Companies  
    Other properties

我们调查了纯 RBAC 及其在几个系统中的实现,发现没有具有层次结构或角色的系统,每个系统都有自定义属性。在 RBAC 中,角色只是权限的集合。

我们可以使用具有属性的权限来模拟我们的案例,例如 ManagerPermission、AdministratorPermission,但这有很多缺点,主要是我们将无法直接将“公司 A 和 B 的经理”之类的角色分配给用户,但是必须为公司 A 和 B 创建一个包含 ManagerPermission 的角色……此外,从语言的角度来看,“经理”似乎是一个“角色”(公司中的职位)而不是“权限”。

将不胜感激有关此主题的任何想法以及该领域的任何经验!

谢谢你。

4

4 回答 4

1

我先说你的两个问题基本相同,应该合并一下。同一概念的多个变体没有任何价值。

您希望为基本角色添加额外级别的任意歧视。

要实现这种 RBAC 并保留利用任何内置基础架构的能力,您需要做出一些妥协并构建一些自定义实现。

第一步是采用角色定义约定的折衷方案。例如,当您想确定用户是否担任“companyA”的“经理”角色时,您可以定义规则,无论是属性、代码还是站点地图,都可以定义为“manager-companyA”,即IsUserInRole("manager-companyA")

第二步是自定义 RoleProvider 实现,它可以解析并适当地查询维护层次关系的底层数据源,您必须为此提供自定义 UI 进行维护。

您至少需要实现 ASP.Net 使用的方法,以确保以正确的格式检查或输出角色。

IsUserInRole将获得一个字符串,您必须使用约定将其解析为组成部分以进行验证,如前所述。

GetRolesForUser可以在缓存 cookie 中的角色时调用,并且必须执行角色的分层递归并输出所有排列。例如,用户是 companyA 和 companyB 的经理,因此GetRolesForUser("user")应该返回一个由值组成的数组,manager-companyAmanager-companyB供 asp.net 基础设施使用,该基础设施利用缓存的角色并且不以交互方式轮询 RoleProvider。

这种方法将为您提供已建立的 ASP.Net RBAC 设施的最广泛可用性,同时为您提供所需的定制。

因此,总而言之,只要您可以调整您的期望和/或重新定义您的要求以尽可能多地使用现有基础架构,您必须实际设计、实施、测试和维护的代码就越少(少得多),您拥有的时间就越多将精力集中在尚未建立基础设施的系统的其他方面。

于 2010-05-15T22:51:40.500 回答
1

我目前正在努力实现自己的 RBAC 库版本(出于简单的原因,即一直学习 RBAC 的内容,同时让它专门针对我的代码库/数据库进行调整)。(注意:约束是最难的部分)!!

我处理这个问题的方式(尚未完全实现)是我创建了组,它们基本上是用户的集合。所以在这种情况下,我会创建三个组;公司 A、公司 B 和公司 C,然后将每个用户适当地分配到这些组(公司)。

然后,您可以将经理角色分配给特定用户,也可以为组分配角色。我喜欢这个,因为它允许我一次向多个用户添加一个卷(在数据库事务期间非常非常快,并且一旦缓存内存占用要小得多)。

因此,在您的示例中,假设您的 UI 中显示了一个机构模型(或对象实例)。只需单击它,然后为其选择“安全”菜单,您将获得一个允许您添加用户/组成员的窗口(如 Windowns 安全性)。通过添加(组)公司 A 并允许“读取”权限,您实质上是允许该组中的所有用户读取该公司及其子对象的访问权限,这些子对象将是客户联系人和数千个其他模型实例。

它可能并不完美,但它是迄今为止我找到的最好的解决方案(尽管我自己仍然有一些问题,我将在 SO 上提出问题)。

于 2010-11-24T03:16:25.653 回答
0

我不确定这是否是您正在寻找的东西,但在我自己搜索有关 RBAC 系统的信息时,我想我可能找到了适合您需求的东西。我正在阅读 Tony Marston 的一篇文章,他谈到了虚拟专用数据库/行级安全性。这些将授予数据级别的权限,这意味着您可以将用户限制为数据库中信息的某些子集。文章的链接如下。

http://www.tonymarston.net/php-mysql/role-based-access-control.html(查看页面底部的“其他类型的访问控制”部分)

同样,我不确定这是否是您正在寻找的东西,但它可能值得快速浏览。

于 2010-05-19T20:20:17.790 回答
0

如果你的问题可以通过为角色实现继承来解决,你可以实现它。

您的示例是采用基于属性的访问控制方式的另一个机会(例如,允许具有经理角色并为公司 A 工作的用户)。但是,实现 RBAC 系统要困难得多。

于 2010-05-15T14:52:35.620 回答