Authentication CakePHP:基于模型的权限?

Authentication CakePHP:基于模型的权限?,authentication,cakephp,permissions,Authentication,Cakephp,Permissions,正在努力决定如何最好地使用以下模型层次结构处理客户端级身份验证: 客户->商店->产品(员工、设备项目等) …如果客户有许多商店,商店就有许多产品(有许多员工,有许多设备项目等) 我已经在用户和客户机之间建立了HABTM关系,这是直接的,可以通过Auth会话或用户模型上的静态方法(如有必要)访问(参见下面的afterFind描述) 现在,我在评估每个模型的afterFind回调中的结果,检查与客户机的关系(基于我针对当前用户所属的客户机查询的模型)。i、 e.如果当前型号为客户端,请检查id;如

正在努力决定如何最好地使用以下模型层次结构处理客户端级身份验证:

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

…如果客户有许多商店,商店就有许多产品(有许多员工,有许多设备项目等)

我已经在用户和客户机之间建立了HABTM关系,这是直接的,可以通过Auth会话或用户模型上的静态方法(如有必要)访问(参见下面的afterFind描述)

现在,我在评估每个模型的afterFind回调中的结果,检查与客户机的关系(基于我针对当前用户所属的客户机查询的模型)。i、 e.如果当前型号为客户端,请检查id;如果当前模型是Store,请检查Store.clientid,最后如果是Product,请从Item.storeid获取父Store,并相应地检查Store.clientid

然而,为了与正确的MVC保持一致,我从afterFind返回true或false,然后必须检查调用操作的返回——这是可以的,但我无法确定Model->find(或Model->read,等等)是否正确由于查找中的id无效或afterFind中的客户端权限而返回false;这也意味着我必须修改每一个动作

我一直在使用的另一种方法是在app_controller.beforeFilter中评估请求,然后通过将请求分解为controller/action/id,我可以查询适当的模型并根据Auth.User.clients数组评估字段,以确定用户是否有权访问请求的客户端。这似乎还可以,但并没有给我留下任何处理/controller/index的方法(afaik)——索引结果将反映客户端成员资格似乎是合乎逻辑的

两者的缺陷都包括一个冗长的条件“规则”列表,我需要分解这些规则来确定当前模型/操作/id在客户端上下文中的位置。总而言之,我觉得他们都有点脆弱和纠结


有第三种选择我没有考虑吗?

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

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

1) 代码已经存在,供您使用。AuthComponent已经内置了它。 2) 它强大且集成,允许您控制站点中的每个操作的权限。 3) 您将能够从其他已经使用过它的cake开发人员那里找到帮助。 4) 一旦您第一次安装了它,在任何其他应用程序上实现完整的站点权限将更容易、更快

以下是一些链接:


或者你可以在谷歌上搜索CakePHP ACL,这听起来像是Cake ACL的工作。这是一个学习曲线,但一旦你弄明白了,这种方法是非常强大和灵活的

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

1) 代码已经存在,供您使用。AuthComponent已经内置了它。 2) 它强大且集成,允许您控制站点中的每个操作的权限。 3) 您将能够从其他已经使用过它的cake开发人员那里找到帮助。 4) 一旦您第一次安装了它,在任何其他应用程序上实现完整的站点权限将更容易、更快

以下是一些链接:


或者你可以在google上搜索CakePHP ACL

我已经研究了ACL,从我所读到的内容来看,它对基于行或基于模型的身份验证不起作用(不推荐),这正是我所追求的。我不确定在模型级别使用权限的优势。但是,您是否考虑过使用UUID并在所有表之间创建一个单独的表。然后可以使用自定义模型绑定来检查权限。在beforeFind中,只需放置一个bindModel('permissions')。然后管理权限会有自定义的bindModels,等等。我已经研究了ACL,从我所读到的内容来看,它对基于行或基于模型的身份验证不起作用(而且不推荐),这正是我所追求的。我不确定在模型级别上权限的优势。但是,您是否考虑过使用UUID并在所有表之间创建一个单独的表。然后可以使用自定义模型绑定来检查权限。在beforeFind中,只需放置一个bindModel('permissions')。然后,管理权限将具有自定义绑定模型等。