CakePHP:基于模型的权限?

时间:2009-10-13 17:51:38

标签: authentication cakephp permissions

决定如何最好地处理具有以下模型层次结构的客户端级别身份验证:

客户 - >商店 - >产品(员工,设备项目等)

...客户有很多商店,商店有很多产品(有很多员工,有很多设备项目等)

我在User和Client之间建立了一个HABTM关系,如果需要,可以通过Auth会话或User模型上的静态方法直接访问(参见下面的查找后的描述)。

现在,我正在评估每个模型的afterFind回调中的结果,根据我正在查询当前用户所属的客户端的模型检查与客户的关系。即如果当前模型是客户端,请检查ID;如果当前模型是Store,请检查Store.clientid,最后如果是Product,从Item.storeid获取父Store并相应地检查Store.clientid。

但是,为了与正确的MVC保持一致,我从afterFind返回true或false,然后必须检查调用操作的返回 - 这没关系,但我无法想到确定如果由于find中的id无效或者因为afterFind中的Client权限而导致Model-> find(或Model-> read等)返回false;这也意味着我必须修改每一个动作。

我一直在玩的另一种方法是在app_controller.beforeFilter中评估请求,并将请求分解为controller / action / id,然后我可以查询相应的模型并评估相对于Auth.User.clients数组,用于确定User是否可以访问所请求的客户端。这似乎没问题,但是没有任何办法(afaik)处理/控制器/索引 - 索引结果反映客户成员资格似乎是合乎逻辑的。

两者中的缺陷都包含一个冗长的条件“规则”列表,我需要细分以确定当前模型/动作/ id在客户端上下文中的位置。总而言之,对我来说,两者都感觉有点脆弱和错综复杂。

我有没有看第三个选项?

1 个答案:

答案 0 :(得分:0)

这听起来像Cake ACL的工作。这是一个学习曲线,但一旦你弄明白,这种方法非常强大和灵活。

Cake的ACL(访问控制列表)允许您将用户与控制器匹配到CRUD(创建读取更新删除)级别。为何使用它?

1)代码已经存在供您使用。 AuthComponent已经内置了它。 2)它功能强大且集成,允许您控制站点中每个操作的权限。 3)您将能够从已经使用过它的其他蛋糕开发者那里获得帮助。 4)第一次安装后,在任何其他应用程序上实现完全站点权限将更加容易和快捷。

以下是一些链接:

http://bakery.cakephp.org/articles/view/how-to-use-acl-in-1-2-x http://book.cakephp.org/view/171/Access-Control-Lists http://blog.jails.fr/cakephp/index.php?post/2007/08/15/AuthComponent-and-ACL

或者你可以google for CakePHP ACL