ACL中的资源应该是什么?对象的模型或对象的实例?

时间:2009-05-20 20:28:59

标签: php zend-framework acl

请帮我实现PHP Web应用程序的访问控制列表。我特意使用Zend_ACL。

我希望对特定实体(无论是用户还是组)有权访问哪种资源进行细粒度的应用程序控制。我希望能够授予对特定资源实例的访问权限,但也授予该类型的所有资源。例如:

  • 用户#1拥有所有帖子的编辑权限
  • 用户#2是客座编辑,对帖子ID#5
  • 具有编辑权限
  • 第1组(访客)拥有对所有内容的读取权限
  • 用户属于从guest虚拟机继承的用户组。

我的问题是:ACL应该引用资源类型还是特定实例?我是否应该使用ACL为用户授予基本的,资源类型范围的特权:

  • 授予编辑
  • 上的用户#1
  • 授予用户#2仅仅是它的继承
  • 授予组#1阅读所有资源
  • 实施例外表以跟踪特定资源的授予和拒绝

或者我应该为我的不同类型的资源的所有单个实例创建资源,并继续授权以允许所有用户阅读所有资源?看起来比较粗野。

我目前的解决方案是这样的:使用资源继承,创建父类的大多数无资源,每个类型的这个根的子元素,然后为每个实例创建每个类型的子元素。这允许我授予一个特定类型并拒绝几个实例,或者拒绝特定类型但是在一个实例上授予(例如上面的用户#2)。这很好地统一了我的权限系统,但是我的需求更复杂。很快,资源类型将被嵌套。所以我会成为父母或孩子的不同模块。一个例子:一个站点范围的照片库模块,一个公告模块,下面还有另一个更独特的画廊。我不太清楚如何解决这个问题。我仍然希望有能力在所有画廊上授予,或者仅仅为一个画廊,或者只是下面的一些照片。请记住,Zend_ACL不支持资源的多重继承。

实现此目的的最佳方法是什么?所有使用ACL或使用内置于每个模块的逻辑?

2 个答案:

答案 0 :(得分:1)

我刚回复SO995925: How should I structure my tree of resources in an ACL?,我对你的建议是完全相同的。

一切都在你的脑海中 - “公告画廊”是“照片画廊”的儿童资源。通用画廊#1父母到“照片画廊”,而“公告画廊”父母到“公告画廊”。如果需要再次拆分树,可以随时在链中添加另一个父资源步骤。

仍然是一个简单的树继承链。

答案 1 :(得分:0)

我认为,您的解决方案计划是大多数系统的工作方式。 Windows文件系统以这种方式工作。我在DCE中使用的第一个ACL系统就是这样工作的。

继承是你必须弄清楚的。您是动态继承还是在创建资源时继承?