在Auth用户会话中包含字段的子集

时间:2013-06-24 02:26:22

标签: cakephp cakephp-2.0 cakephp-2.1

我的用户表包含大量字段,其中大多数字段我不需要/想要存储在Auth用户会话中。如何限制登录用户在会话中存储哪些字段?

我知道您可以使用“包含”键选择关联模型的字段,但通常选择顶级模型的字段,您可以使用“字段”键。但在Auth的情况下,'fields'键用于选择要对用户进行身份验证的字段,而不是要在会话中包含哪些字段。

为了给出一些上下文,这里是我的代码到目前为止...我将如何做到这一点,以便只有电子邮件和名字字段存储在Auth会话中,而不是Users表中的所有字段。

$this->Auth->authenticate = array(
    'Blowfish' => array(
        'fields' => array(
            'username' => 'email',
            'password' => 'password',
        )
    )
);

4 个答案:

答案 0 :(得分:2)

我赞成了有用的答案,尽管是解决方法 - 谢谢。

我认为“正确”的答案是没有办法用CakePHP Auth组件开箱即用,你必须破解它(例如,使用下面的解决方案之一)。我查看了BaseAuthenticate.php中的_findUser方法,并确认了这一点。

如果CakePHP核心开发人员正在阅读(DeEuroMarK?),这可能是一个非常常见的要求,我认为这是一个值得内置的功能。

建议实施:只需在“字段”数组中包含您想要的字段作为额外字段 - 并假设除“用户名”和“密码”之外的每个键都是应包含在auth会话中的额外字段。这样,它与其他模型查找语法一致。

示例:

$this->Auth->authenticate = array(
    'Blowfish' => array(
        'fields' => array(
            'username' => 'email',
            'password' => 'password',
            'another_field',
            'yet_another_field'
        )
    )
);

答案 1 :(得分:1)

我已经搜索并在stackoverflow上找到了一些答案:

cakephp / don't store all user data in session while using authComponent

它很有用。

答案 2 :(得分:1)

在我的UsersController的beforeFilter中,我有类似登录的内容。

然后我将afterLogin函数设置为重定向

 $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'afterLogin');
 $this->Auth->loginRedirectTrue = array('controller' => 'users', 'action' => 'index');
 $this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'display');

登录功能dus进行一些检查,然后重定向到

if ($this->Auth->login()){
    // code here
    $this->redirect($this->Auth->redirect());
}
像这样的

和afterLogin函数

 function afterLogin(){
    $session = $this->Session->read('Auth');
    $user_id = $session['User']['id'];

    // change this to find only the fields you need and then override the Auth.User...
    $user = $this->User->findById($user_id);
    if (!empty($user)){
        $this->Session->write('Auth.UserProfile', $user['UserProfile']);
    }
    $this->redirect($this->Auth->loginRedirectTrue);
 }

您应该更改find​​ById以满足您的需要,然后覆盖会话中的Auth.User字段。

祝你好运!

答案 3 :(得分:0)

我认为最简单的是添加这样的东西:

在您的Auth-Component配置中添加一个包含

$this->loadComponent('Auth', [
        'authorize' => 'Controller',
        'loginRedirect' => [
            'controller' => 'Users',
            'action' => 'index'
        ],
        'logoutRedirect' => [
            'controller' => 'Users',
            'action' => 'login'
        ],
        'authenticate' => [
            'Form' => [
                'fields' => ['username' => 'email'],
                'contain' => ['Groups']
            ]
        ],
        'unauthorizedRedirect' => $this->referer()
    ]);
...

在您的登录操作中将用户保存在会话中:

$foundUser = $this->Auth->identify();
if ($foundUser) {
    $this->Auth->setUser($foundUser);
}
...

这会将包含组添加到Auth.User

是CakePhp3的版本 - 在旧版本中可能会有所不同。