Php 我应该如何在ACL中构建我的资源树?

Php 我应该如何在ACL中构建我的资源树?,php,zend-framework,permissions,acl,zend-acl,Php,Zend Framework,Permissions,Acl,Zend Acl,使用PHP和Zend_ACL,我想创建一个非常灵活的权限系统。我希望能够为特定类型的所有对象以及这些对象的实例分配权限。如果查询的对象的特定实例在资源树中不存在,则可以使用“通用”对象的权限集。我的问题是这需要嵌套,我无法找到一种没有多重继承的方法,Zend_ACL不支持多重继承 这就是一个例子。包含学院、课程和活动的在线学习网站。每项活动属于一门课程,每门课程属于一名教员。我希望能够允许每个教员角色访问所有课程(以及继承的事件),但特定教员希望他们的材料是私有的。因此,我让我的资源树的结构为每

使用PHP和Zend_ACL,我想创建一个非常灵活的权限系统。我希望能够为特定类型的所有对象以及这些对象的实例分配权限。如果查询的对象的特定实例在资源树中不存在,则可以使用“通用”对象的权限集。我的问题是这需要嵌套,我无法找到一种没有多重继承的方法,Zend_ACL不支持多重继承

这就是一个例子。包含学院、课程和活动的在线学习网站。每项活动属于一门课程,每门课程属于一名教员。我希望能够允许每个教员角色访问所有课程(以及继承的事件),但特定教员希望他们的材料是私有的。因此,我让我的资源树的结构为每个教员都有一个资源节点,并且从教员节点让每个属于该教员分支的课程分支,而不是从通用课程节点分支,该节点为每个课程提供默认权限。在新结构中,我如何应用我的通用课程权限?课程下的事件也是如此,如果我希望每个事件只有在父课程可读的情况下才可读,但我还希望对每个事件应用默认权限集,那么如何组织树,使每个事件从其父事件和其通用节点继承,而无需多次继承


欢迎对不同系统提出任何问题、意见或建议

Zend ACL非常灵活。子资源的权限覆盖从父资源继承的权限。即使我没有完全理解你的例子,我认为Zend ACL模型支持你的设计。您可以毫无问题地访问特定角色的特定资源


然而,也许你也能读到,这给了你额外的自由度

您的多重继承问题完全在您的头脑中-当然,除非您可以在多个学院中-等等。构建一个额外的“父资源”,可以从基本“课程”更改ACL

您不希望课程直接继承教员权限;你可能会希望有人能够编辑该系的课程(助教或其他),但不是该系本身,对吗

学院、课程和活动。每个 事件属于一个课程,每个 教授课程

这将按教员为您提供课程组,但仍将继承默认的课程权限。添加每个资源时,只需将其设置为组资源的父资源,而组资源是整个资源的父资源

如果您想隐藏特定课程的所有事件,只需设置Event:course的权限即可#

如果您希望能够对教员的所有活动设置权限,只需在Event:Course1上方添加另一个“中间人”父级,该父级还可以按教员对事件进行分组:
events:Faculty2:Course1:Event3


我发现,对于权限系统,10次中有9次您不需要(或不想混淆)多重继承。如果您的访问控制比简单的树更复杂,您应该重新评估您的访问控制。

我找不到适合当前系统的方法。我希望能够为每种类型的对象定义一组默认规则,但也为这些对象的实例提供特定的规则,同时保留类型和实例之间的继承性。这意味着事件ID#4继承自其父课程实例,以及默认的事件类型。在Zend#u ACL学院中,课程和事件都是资源,它们相互继承。假设我们有两个角色:局内人和局外人。在构建ACL树时,默认情况下,您将允许对内部人员的所有访问,并关闭对外部人员对相同资源的所有访问。这将是你的默认行为。现在,如果您希望在命名的附加条件下为角色/资源提供一些特殊行为,只需对规则进行断言即可。如果断言被执行,那么您将从一般规则中获得执行,否则将执行常规规则。我一直在玩弄断言,我认为它们会起作用,但是设计和接口以允许应用它们将非常困难。而且,它阻止我用断言(非琐碎的东西)做我想做的事情。你认为我可以部署一个修补过的Zend框架吗?我不推荐,除非是针对一个简单的项目。从长远来看,事情会变得更加混乱和复杂。我已经用其他bug尝试了这条路径。如果扩展当前ACL类不是您的选择,那么您可能应该构建自己的ACL系统。类似:
Parent -> middleman -> child
Courses -> Courses:Faculty2 -> Courses:Faculty2:Course1 
Events -> Events:Course1 -> Events:Course1:Event3