2010-05-15 112 views
4

目前,我们正在一个角色设计一个用户角色和权限系统在我们的Web应用程序(ASP.NET),它似乎是我们有几个案件不适合在经典基于角色的访问控制(RBAC)。我会发布几个问题,每个问题都专注于一个特定的案例。这是我的第二个问题(第一个问题在这里:Non RBAC User Roles and Permissions System: checking the user's City)。非RBAC用户角色和权限系统:与性能

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

根据经理所属的公司,他有访问某些操作:例如,他可以只与他所属公司的客户沟通。也就是说,“公司A和公司B的经理”只能与公司A和公司B的客户进行联系,而不能与公司C的客户进行联系。他还可以查看公司A和B的客户详细信息页,而不是C等。

看来这种情况属于RBAC。但是,情况并非如此。我们需要创建一个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的角色......此外,”经理“似乎更像是一个”角色“(在公司中的职位),而不是来自语言学的观点。

对于这个主题的任何想法以及此领域的任何经验,都不胜感激!

谢谢。

回答

0

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

你的例子是另一种去基于属性的访问控制方式的机会(例如,允许具有管理者角色并且为公司A工作的用户)。尽管如此,实施RBAC系统要困难得多。

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设施的最大可用性,同时为您提供所需的定制。

所以,最后,只要你能调整你的期望和/或重新定义您的要求尽可能工作与现有基础设施的少(少得多)的代码,你必须实际设计,实施,测试和维护而且您必须花费更多时间专注于系统尚未建立完善基础架构的其他方面。

+1

类似IsUserInRole(“manager-companyA”)的代码根本不漂亮。我们希望拥有像IsUserInRole(“manager”,companiesList)这样的代码。此外,角色的这些属性的数量可能很大,像“manager-companyA,companyB ...”这样的字符串可能会变得太长。 我认为我们可以通过自己创建我们自己的权限和角色系统,而不使用ASP.NET角色来做得更好。我真的没有看到任何麻烦。 – 2010-05-16 11:02:41

+0

@micha - 你可能误解了我写的一些内容。也许审查可能会将其清除。并且设计,实施,测试和维护了几个定制的提供商堆栈,并为浪费的时间,金钱和睡眠感到后悔,我只能祝你好运。 – 2010-05-16 11:30:48

+0

@code诗人。我不能同意重新创造轮子的谬论。但有时轮子不适合。一本很好的书是'\t \t 专业ASP.NET 2.0安全性,成员和角色管理' 它痛苦详细地描述每个事情如何滴答。 – ggonsalv 2010-05-20 03:30:16

0

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

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

同样,我不知道这是你在找什么或没有,但它可能是值得的快速浏览。

1

我目前正在努力实现我自己的RBAC库版本(出于简单理解RBAC的胆量,同时让它专门为我的代码库/数据库调优)的困扰。 (注意:约束是困难的部分)!

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

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

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

这可能不是完美的,但这是迄今为止我发现的最好的解决方案(尽管我仍然有自己的问题,我将就此问题提出一个问题)。