请帮助我为我的 PHP Web 应用程序实现访问控制列表。我专门使用 Zend_ACL。
我希望对哪些特定实体(无论是用户还是组)可以访问哪些资源进行细粒度的、应用程序范围的控制。我希望能够授予对特定资源实例的访问权限,以及对该类型的所有资源的访问权限。例如:
- 用户 #1 拥有所有帖子的编辑权限
- 用户 #2 是客座编辑,对帖子 ID #5 具有编辑权限
- 第 1 组(来宾)对所有内容都具有读取权限
- 用户属于从来宾继承的用户组。
我的问题是:ACL 是否应该引用资源类型或其中的特定实例?我是否应该像这样使用 ACL 授予用户基本的、资源类型范围的特权:
- 在帖子上向用户 #1 授予编辑权限
- 授予用户 #2 只不过是继承
- 授予组 #1 读取所有资源
- 实施例外表以跟踪对特定资源的授予和拒绝
或者我应该为我的不同类型资源的所有单个实例创建资源并继续授权横冲直撞以允许所有用户读取所有资源?看起来比较野蛮。
我当前的解决方案是这样的:使用资源继承,创建一个没有类型的最父资源,为每种类型创建一个此根的子资源,然后为每个实例创建每种类型的子资源。这允许我授予一种特定类型并拒绝少数实例,或者拒绝特定类型但授予一个实例(如上面的用户#2)。这很好地统一了我的权限系统,但是我的需求更复杂。很快,资源类型将被嵌套。所以我将不同的模块谁可以是父母或孩子。一个例子:一个站点范围的照片库模块,一个公告模块,下面有另一个更独特的画廊。我不太确定该怎么做才能解决这个问题。我仍然希望能够授予所有画廊,或者只是一个,或者只是下面的一些照片。请记住 Zend_ACL 没有
实现这一点的最佳方法是什么?全部使用 ACL 还是使用每个模块中内置的一些逻辑?