【问题标题】:Existing Fine-grained access control library/framework?现有的细粒度访问控制库/框架?
【发布时间】:2011-02-21 15:18:16
【问题描述】:

假设我有这样的要求:

角色 AA 中的用户 A 需要能够更新 A1 类型的所有实体。

角色 BB 中的用户 B 只需要能够更新主标识符为“2”的 A1 类型的实体,我将其称为 A1(“2”),并且不能更新任何其他类型的实体A1,但可以向实体 A1("2") 添加或删除任意数量的 B2 类型的子实体。

角色 CC 中的用户 C 需要能够编辑属于实体 A1(“2”)的这些子 B2 实体的大部分但不是全部属性,角色 CC 的成员也不能从 A1( "2")。

用户 D 属于角色 BB 和角色 CC,并且作为组合成员资格的结果,具有从两组权限的联合派生的权限(在这种情况下,因为角色 CC 权限是角色的适当子集BB,这意味着用户 D 可以为角色 BB 做任何事情)。

等等。这些策略可能会在部署后更改,因此不需要进行重大的重新开发工作来实施更改(例如解决此问题的声明性方法可能需要什么)。

我假设访问控制列表 (ACL) 将存储在受保护对象的旁边或内部。

我认为编写代码的开发人员需要能够以命令式(而不是声明式)查询单个方法/函数/操作/过程,参数标识当前主体、正在考虑的对象、正在考虑的操作(也许我们称之为特权),然后检索一个布尔值,该值指示是否应允许或拒绝该操作。

请随意挑战我的假设。

现在,我已经有了一个简单而有效的专有通用解决方案(基于我已经致力于生产并且运行良好的工作)。我正在考虑将其作为开源项目发布。

但在我将它提升到一个新的水平并构建这个野兽之前,我想知道是否有人知道已经被广泛接受的系统、模块或库(不一定必须是 .NET),它已经帮助开发人员实现这种对实体的细粒度控制(无论是数据库记录还是 ORM 中的对象等等)。

P.W.在将其发布到 SO 之前查看答案时,我在其他地方 (SO LINK) 找到了一个答案,表明 Zend_Acl 可能对 LAMP 项目具有这种功能,但我更喜欢 .NET/Windows 解决方案。

【问题讨论】:

    标签: .net security access-control


    【解决方案1】:

    原来我需要的东西(不知道为什么我以前没有看到它)是 Windows AzMan。花了一些功夫才弄明白如何做类似可继承 ACL 之类的事情,但是通过对范围的一些创造性使用,我拥有了一个非常易于管理、灵活且快速的系统。

    AzMan 非常棒,但它的文档还有一些不足之处。

    【讨论】:

      【解决方案2】:

      Rhino Security 值得一看。可能会改变你的假设......

      【讨论】:

      • 我看到了 Rhino Security,但我没有使用 NHibernate,而且似乎 Rhino Security 就是为此而构建的。如果这是真的,那么对于我正在尝试做的事情来说,它还不够通用。我弄错了吗?