我的模型具有以下关系,定义了用户可以属于多个组的情况,并且可以授予多个组访问项目的权限。
User
HABTM Group
HABTM Project
我想进行设置,以便在项目模型上完成的任何find()
只会返回当前用户有权访问的结果,具体取决于她的群组成员资格。
我的第一个想法是使用beforeFind()
回调来修改查询。然而,两级协会让我难过。我通过重新绑定模型解决了类似的问题(参见this question)。但是,这是一个自定义查找方法 - 我不认为这种方法可以在这样的一般情况下工作,我需要修改任意查询。
使用afterFind()
过滤结果不是一个好主意,因为当它没有返回正确数量的记录时会混淆分页(例如)。
最后,我有一种唠叨的怀疑,我正试图重新发明轮子。我在CakePHP中看到的访问控制(例如Cake ACL)一直处于控制器/动作级别而不是模型/记录级别,但我觉得这应该是一个已解决的问题。
编辑:我最终认为这过于复杂,只是在我的项目模型中添加了getAccessibleByUser($id)
方法。但是,我仍然很好奇是否可以在所有find()
操作中全局添加此类限制。这似乎是你想在beforeFind()
中做的事情,我怀疑(正如DavidYell在下面所建议的那样)答案可能在于包含行为。
答案 0 :(得分:0)
您应该查看Containable行为。如果您使用的是CakePHP 2.x,那么它就会出现在框中。
此行为允许您管理模型关系及其返回的数据,并允许您将条件(例如group_id)传递到包含中。
http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html