CakePHP 3 - 多字段验证登录

问题描述 投票:4回答:2

我想使用多个字段检查登录。

当前情况:使用(Email)和(Password)字段进行登录

<div>
   <input name="email" placeholder="Email">
   <input name="password" placeholder="Password">
   <input type="submit" value="Login">
</div>

这是我的AuthComponent配置:

$this->loadComponent('Auth', [
    #Some other configuration
    'authenticate' => [
        'Form' => [
            'fields' => ['username' => 'email']
        ]
    ],
    'storage' => 'Session'
 ]);

我的期望:使用(EmailPhone)和(Password)字段登录

<div>
   <input name="email_or_phone" placeholder="Email or Phone">
   <input name="password" placeholder="Password">
   <input type="submit" value="Login">
</div>

如何配置AuthComponent以满足这种情况?

php authentication cakephp cakephp-3.0
2个回答
5
投票

如果要基于“任一或”基础进行身份验证,则必须使用自定义查找程序,因为身份验证程序的内置查找程序仅用于匹配单个列。

在您的表单中定义输入:

<?= $this->Form->input('email_or_phone'); ?>

在您的身份验证配置中设置字段和查找器:

$this->loadComponent('Auth', [
    'authenticate' => [
        'Form' => [
            'fields' => [
                'username' => 'email_or_phone'
            ],
            'finder' => 'auth'
        ]
    ]
]);

在您的(可能是UsersTable)表类中定义finder,您可以使用username选项来构建所需的条件:

public function findAuth(\Cake\ORM\Query $query, array $options)
{
    return $query->where(
        [
            'OR' => [
                $this->aliasField('email') => $options['username'],
                $this->aliasField('phone') => $options['username'],
            ]
        ],
        [],
        true
    );
}

请注意,验证者通过配置的email_or_phone字段从请求中获取的值将始终传递给username选项中的finder!

另请注意,您必须使用Query::where()的第三个参数删除验证器生成的可能现有条件,或者在本示例中显示它们。

也可以看看


2
投票

请尝试以下方法:

$this->loadComponent('Auth', [
    #Some other configuration
    'authenticate' => [
        'Form' => [
            'fields' => ['username' => ['email','phone']]
        ]
    ],
    'storage' => 'Session'
 ]);

只需将值作为数组传递给username

在您的登录功能中执行以下操作:

$username  = $this->data['User']['username'];
$user = $this->User->findByEmail($username);
if (empty($user))
{
    $user = $this->User->findByPhone($username);
}
© www.soinside.com 2019 - 2024. All rights reserved.