【问题标题】:CakePHP: model-based permissions?CakePHP:基于模型的权限?
【发布时间】:2009-10-13 17:51:37
【问题描述】:

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

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

...其中 Client hasMany Stores,Store hasMany Products(hasMany Staff,hasMany EquipmentItem 等)

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

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

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

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

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

是否有第三个选项我没有考虑?

【问题讨论】:

    标签: authentication cakephp permissions


    【解决方案1】:

    这听起来像是 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

    或者你可以在谷歌上搜索 CakePHP ACL

    【讨论】:

    • 我研究了 ACL,从我读到的内容来看,它对于基于行或模型的身份验证不起作用(也不推荐),这正是我所追求的。
    • 我不确定模型级别权限的优势。但是,您是否考虑过使用 UUID 并在所有表之间创建单个权限 HABTM 表。然后您可以使用自定义模型绑定来检查权限。在你的 beforeFind 中只放一个 bindModel('permissions')。然后管理权限将有自定义的 bindModels 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2011-10-02
    • 1970-01-01
    • 2019-03-24
    • 2020-05-29
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多