【发布时间】:2011-11-16 05:10:38
【问题描述】:
这个问题是在为自定义应用程序设计专用 ACL 系统时提出的,但我认为它一般适用于 ACL 系统,因为我还没有通过查看一些主流系统找到如何解决这个问题,喜欢Zend_ACL。
在我的应用程序中,权限是动态授予的,例如:用户获得对活动的查看权限,因为他是活动所链接到的团队的成员。这是基于您始终有一个 Employee(用户)想要对 Item(我的应用程序中的一个对象,例如 Activity、Team 等)执行操作(查看/编辑/等)的假设.这足以满足我的目标用途;
$Activity = new Activity( $_POST['activity_id'] );
$Acl = new Acl( $Activity );
if ( !$Acl->check( 'edit' ) {
throw new AclException('no permission to edit');
}
我的 Acl 类包含授予权限的所有业务规则,它们是“动态”创建的(尽管有时出于性能原因缓存);
/**
* Check the permissions on a given activity.
* @param Activity $Activity
* @param int $permission (optional) check for a specific permission
* @return mixed integer containing all the permissions, or a bool when $permission is set
*/
public function checkActivity( Activity $Activity, $permission = null ) {
$permissions = 0;
if ( $Activity->owner_actor_id == $this->Employee->employee_id ) {
$permissions |= $this->activity['view'];
$permissions |= $this->activity['remove'];
$permissions |= $this->activity['edit'];
} elseif ( in_array( $this->Employee->employee_id, $Activity->contributor_ids_arr ) ) {
$permissions |= $this->activity['view'];
} else {
/**
* Logged in user is not the owner of the activity, he can contribute
* if he's in the team the activity is linked to
*/
if ( $Activity->getTeam()->isMember( $this->Employee ) ) {
$permissions |= $this->activity['view'];
}
}
return ( $permission ? ( ( $permission & $permissions ) === $permission ) : $permissions );
}
这个系统可以正常工作。
当您想要“反转”ACL 规则时,就会出现这种方法的问题。例如,“获取我允许编辑的所有活动”。我不想在需要活动的代码中放入像WHERE owner_actor_id = $Employee->employee_id 这样的任何逻辑,因为这是Acl 类的职责,它应该保持集中。对于当前的实现,我没有其他选择来获取代码中的所有活动,然后一一声明它们。这当然是一种非常低效的方法。
所以我正在寻找关于一个好的架构的一些想法(或指向现有 ACL 实现或一些相关设计模式的指针)来创建一个 ACL 系统,该系统可以以某种方式同时执行 hasPermission( $Item, $permission ) 和 fetchAllItems( $permission ),理想情况下,使用相同的业务规则集。
提前谢谢大家!
我查看了Zend_ACL 的实现,但它更侧重于一般权限。我还在 SO 上发现了以下问题:
但不幸的是,他们似乎也没有回答这个问题。
【问题讨论】:
-
反对将
fetchAllItems()方法放在Acl类中的理由是什么?我不确定我是否真的理解这个问题。
标签: php oop design-patterns acl