【发布时间】: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