假设我有这样的要求:
角色AA中的用户A需要能够更新A1类型的所有实体。
角色BB中的用户B需要能够仅更新主要标识符为“2”的A1类型的实体,我将其称为A1(“2”),并且不能更新任何其他类型的实体A1,但可以向实体A1(“2”)添加或删除任意数量的B2类子实体。
角色CC中的用户C需要能够编辑属于实体A1(“2”)的这些子B2实体的大多数但不是所有属性,角色CC的成员也不能从A1添加或删除B2实体( “2”)。
用户D位于角色BB和角色CC中,并且作为组合成员资格的结果,具有从两组权限的联合派生的权限(在这种情况下,因为角色CC权限是角色的正确子集BB,这意味着用户D可以完成角色BB的所有允许。
等等。部署后可能会更改这些策略,因此不需要进行重大的重新开发工作来实现更改(例如,解决此问题的声明方法可能需要这样做)。
我假设访问控制列表(ACL)将存储在受保护对象的旁边或内部。
我认为编写代码的开发人员需要能够命令性地(不是声明性地)查询单个方法/函数/操作/过程,其中参数标识当前主体,正在考虑的对象,正在考虑的操作(可能我们称之为特权),然后检索一个布尔值,指示是允许还是拒绝操作。
随意挑战我的假设。
现在,我已经有了一个简单但有效的专有通用解决方案(基于我已经致力于生产并且工作得很好的工作)。我正在考虑将其作为一个开源项目发布。
但是在我把它提升到一个新的水平并构建这个野兽之前,我想知道是否有人知道一个广泛接受的系统,模块或库(不一定是.NET)已经帮助开发人员实现这种对实体的细粒度控制(无论是ORM中的数据库记录还是对象等)。
P.W。在将答案发布到SO之前回顾答案时,我在其他地方找到了答案(SO LINK),表明Zend_Acl可能具有LAMP项目的这种功能,但我更喜欢.NET / Windows解决方案。
答案 0 :(得分:1)
原来我需要的东西(不知道为什么我之前没有看到它)是Windows AzMan。花了一些工作来弄清楚如何做一些可继承的ACL,但是通过一些创造性的范围使用,我有一个非常易于管理,灵活,快速的系统。
AzMan完全摇滚,但它的文档有点不尽如人意。
答案 1 :(得分:0)
Rhino Security值得一看。可能会改变你的假设......