我试图提出一个很好的解决方案,将我的应用中的任何记录分配给用户或组,然后根据这些分配过滤该模型,我遇到了一些困难。
我提出了以下Assignment-model:
Assignment
-id
-assignedto_key
-assignedto_model (either User or Group [hasMany/belongsTo is between User and Group])
-foreign_key
-foreign_model
到目前为止一切顺利。现在,我希望能够将我的应用程序中的任何记录分配给整个组或一组个人用户。
例如:
Assignment
-id = 1 (I'm actually using UUIDs)
-assignedto_key = 1
-assignedto_model = User (so this would be assigned to User.id = 1)
-foreign_key = 1
-foreign_model = Painting
Assignment
-id = 2 (I'm actually using UUIDs)
-assignedto_key = 1
-assignedto_model = Group (so this would be assigned to any User with group_id = 1)
-foreign_key = 1
-foreign_model = Painting
Therefore: User 1 can now access the Painting 1. Furthermore, ANY user with group_id = 1 can also access Painting 1.
到目前为止一切顺利。我可以毫不费力地创建一个逻辑,使管理员能够进入记录(例如,绘画)并选择应该能够看到这一点的组/用户。
然而,我迷失的地方是我想要过滤数据的时间:
基本上,我需要能够只将记录返回给他们有权访问的用户。
目前,我正在考虑将此视为一种行为,我将附加到所有“可分配”模型。
public function beforeFind(Model &$model, $query)
{
// Let's imagine that $model is of type Painting
// I can only think of the following solution:
$Assignment = ClassRegistry::init('Assignment');
$assignedIDs = $Assignment->find('all', array('fields'=> array('id'), 'conditions' => array(
'Assignment.foreign_model' => $model->alias,
'or' => array(
array('Assignment.foreign_model' => 'User', 'Assignment.foreign_key' => AuthComponent::user('id')),
array('Assignment.foreign_model' => 'Group', 'Assignment.foreign_key' => AuthComponent::user('group_id'))
)
)));
$ids = Set::extract('{n}.' . $this->alias . '.id', $assignedIDs);
$query['conditions'][] = array($this->alias . '.id' => $ids);
}
以上内容将获取当前模型中的所有作业,并仅在其中进行查询。但这对我来说似乎效率低下。
有人会对如何实现这样的功能有任何指示吗?
非常感谢,我期待您的回复。
编辑:正如旁注 - 我不认为我在这种情况下正在寻找ACL,因为我希望只返回过滤结果 - 但我可能错误地认为在这种情况下,ACL不是正确的选择。
答案 0 :(得分:1)
你在这里描述的是一种多态关系'。纯数据库对它们皱眉,因为关系是在数据中编码的,而不是模式。我们其他人使用&em; em因为它们起作用; - )
您是否见过:http://bakery.cakephp.org/articles/AD7six/2008/03/13/polymorphic-behavior(它是1.3行为,但可移植到2.x)。它处理了处理多态表的大量工作。