来自HABTM关系的用户权限

时间:2012-11-06 14:58:29

标签: cakephp authentication has-and-belongs-to-many

我有一个'User'模型,该模型通过HABTM关系与'Group'模型相关。我能够查询模型以确定经过身份验证的用户所属的成员身份,但无法从概念上提出在页面的isAuthorized()函数调用中轻松访问该数据的方法。

理想情况下,我希望有一种方法可以链接到身份验证方法并缓存授权用户的组成员身份,以便我可以快速查找isAuthorized()次呼叫。蛋糕中是否有一些功能允许这样做?我显然对建议持开放态度,因为在从过去的员工继承这个项目之后,我对这个框架还不熟悉。

从我能够收集的内容来看,我希望能够访问或搜索AuthComponent::user()返回的用户的组成员身份,但由于这是一种静态方法,我无法访问它的模型。这可能吗?

修改: 解决方案是我与ndm讨论的混合,以及发现应用程序似乎破坏了身份验证。这可能是最后一个创建应用程序的开发人员的错,但我设法通过覆盖部分BaseAuthenticate_findUser($username,$password)函数来继承'Group'数组以及'User'数组来解决它。它是在登录时获取的,但只有模型的“用户”部分返回到名为Auth的Controller。

1 个答案:

答案 0 :(得分:3)

重新获取当前登录用户的组应该很简单,您只需要适当地配置authentication handler,以便获取相关模型。这可以使用resurivecontain设置来完成,尽管后者似乎有点破坏(至少行为是意外的)。

使用recursive的示例:

$this->Auth->authenticate = array
(
    'Form' => array
    (
        'userModel' => 'User',
        'recursive' => 1
    )
);

使用contain的示例:

$this->Auth->authenticate = array
(
    'Form' => array
    (
        'userModel' => 'User',
        'contain' => array('Group')
    )
);

为了使contain方法有效,User模型需要充当Containable!但是,如上所述,这似乎被打破了,因为recursive is always used,并且不可能将其设置为null,因为它被转换为整数。所以你也需要提供适当的recursive设置(即recursive = 1),但是这会以某种方式违背Containable行为的目的,该行为应该自动找出适当的递归设置(除非另有配置) )。

无论如何,两者都会使验证者获取您的User HABTM Group关联。无论哪种方式,您都应该能够通过AuthComponent::user()从任何地方访问数据:

$currentUser = AuthComponent::user();
pr($currentUser['Group']);

编辑(07.11.2012):在身份验证处理程序配置中使用contain的问题现在为fixed for 2.2.4,因此可以通过null recursive设置。