基于角色的ACL应该如何设计:
多个团队,每个团队由一名经理和多名成员组成,并在一个位置工作。每个位置可以有多个团队,并且有多个位置。
每个团队的经理只能查看/编辑其团队成员的数据。一个人也可以是多个团队的成员,与位置无关。
Location_1
-Team_1 -Team_2
-Manager -Manager
-Member_1 -Member_1
-Member_2 -Member_2
Location_2
-Team_1 -Team_2
-Manager -Manager
-Member_1 -Member_1
-Member_2 -Member_2
我的想法:我正在考虑将其分成两部分。第 1 部分:每个团队应该有一个小组。维护数据库中的组成员身份表。部分2:现在,每个用户都可以具有任何角色。ACL可以根据这些角色进行设计。但是数据将根据第 1 部分获取。这样,可以在不更改代码的情况下添加新团队。这是一条正确的路吗?
这里有一个相当健谈的答案,只有松散的讨论,没有代码,至少目前是这样。
您自己的模型/数据结构必须考虑成员、位置和团队。我想你已经非常清楚地描述了这些关系,所以这应该是直截了当的。关系思维:团队成员(包括经理)的表格;位置表;一个团队表,其中外键表示位置,外键表示标识经理的成员;将成员链接到团队的交叉引用表。我假设您的成员模型将具有isManagerOfTeam($team)
,isMemberOfTeam($team)
之类的方法。很简单。
但其中大部分只是对关系进行建模,可以说独立于访问控制。
对于访问控制,位置似乎无关紧要;关键是团队成员和团队管理。
听起来您尝试访问控制的数据(最终将成为"资源")将被标记为成员ID,以标识"拥有"成员。因此,该数据的模型可能具有getMember()
甚至只是getMemberId()
的方法。
因此,我看到一些 Acl 规则使用Zend_Acl_Assert_Interface
实例对角色 ($member) 与这些资源之间的关系进行动态检查:
- My_Acl_Assertion_BelongsToSelf
- My_Acl_Assertion_BelongToMemberUnderManagement
然后,assert()
方法可以对传递的角色和资源调用相关的模型方法,以检查团队和管理关系。
就像我说的,有点松散的答案,但希望它对一些想法有所帮助。