4

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

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

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

4

2 回答 2

2

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

您不希望课程直接继承教师权限;您可能希望有人能够为该学院(助教之类的)编辑课程-但不是学院本身,对吗?

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

Parent -> middleman -> child
Courses -> Courses:Faculty2 -> Courses:Faculty2:Course1 
Events -> Events:Course1 -> Events:Course1:Event3

ETC

这将按教师为您提供课程组,但仍继承默认课程权限。当您添加每个资源时 - 只需使其成为其组资源的父级,即整个资源的父级。

如果您希望隐藏特定课程的所有活动 - 您只需在 Event:Course 上设置权限#

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

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

于 2009-08-11T08:22:29.157 回答
0

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

不过,也许您还可以阅读有关断言的内容,这为您提供了额外的自由度。

于 2009-06-15T14:10:09.893 回答