使用PHP和Zend_ACL,我想创建一个非常灵活的权限系统。我希望能够为特定类型的所有对象以及这些对象的实例分配权限。如果查询对象的特定实例并且资源树中不存在该对象,则可以使用“通用”对象的权限集。我的问题是,这需要嵌套,如果没有多重继承,我无法找到一种方法,Zend_ACL不支持。
一个例子就是这样。一个有学院,课程和活动的在线学习网站。每个活动都属于一门课程,每门课程都属于一个教师。我希望能够允许每个教师角色访问所有课程(和继承的事件),但特定教师希望他们的材料是私人的。因此,我使我的资源树的结构具有每个教师的资源节点,并且每个课程都属于教师节点的教师分支,而不是从通用课程节点分支,这为每个课程提供了默认权限。使用新结构,我如何应用我的通用课程权限?对于课程下面的事件也是如此,如果我希望每个事件只有在父课程可读时才可读,但我还想对每个事件应用一组默认权限,我如何组织树以使每个事件继承从它的父节点和没有多重继承的通用节点?
非常欢迎对不同系统提出任何问题或意见或建议。
答案 0 :(得分:2)
你的多重继承问题在你脑海中 - 除非当然可以在多个院系中 - 等等。构建一个额外的“父资源”,可以从基础“课程”改变ACL。
您不希望课程直接继承教师权限;你可能希望某人能够编辑该教师的课程(TA或其他东西) - 但教师本身不是吗?
学院,课程和活动。每 事件属于一个课程,每个 当然是一个教师
Parent -> middleman -> child
Courses -> Courses:Faculty2 -> Courses:Faculty2:Course1
Events -> Events:Course1 -> Events:Course1:Event3
等
这将为教师提供课程组,但仍会继承默认课程权限。当您添加每个资源时 - 只需将其作为其资源的父资源,该资源是整个资源的父资源。
如果您希望隐藏特定课程的所有活动 - 您只需在活动上设置权限:课程#
如果您希望能够为教师的所有事件设置权限,您可以在事件:课程1上方添加另一个“中间人”父母,该课程也按教师分组事件:Events:Faculty2:Course1:Event3
我发现权限系统中有9次中有10次你不需要(或想要混淆)多重继承。如果您的访问控制比简单树更复杂,则应重新评估访问控制。
答案 1 :(得分:0)
Zend ACL非常灵活。子级的权限会覆盖父资源的继承权限。即使我没有完全得到你的例子,我认为Zend ACL模型支持你的设计。您可以毫无问题地访问特定角色的特定资源。
尽管如此,也许您还可以阅读assertions,它可以为您提供额外的自由度。