CakePHP 3 - 多字段验证登录

时间:2017-10-12 10:24:22

标签: php authentication cakephp cakephp-3.0

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

当前情况:使用(Password)和(<div> <input name="email" placeholder="Email"> <input name="password" placeholder="Password"> <input type="submit" value="Login"> </div> )字段进行登录

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

以下是我的AuthComponent配置:

Email

我的期望:使用(PhonePassword)和(<div> <input name="email_or_phone" placeholder="Email or Phone"> <input name="password" placeholder="Password"> <input type="submit" value="Login"> </div> )字段进行登录

isodepth

如何配置 AuthComponent 以应对这种情况?

2 个答案:

答案 0 :(得分:5)

如果您想根据&#34;或者&#34;进行身份验证。然后你必须使用自定义查找程序,因为验证程序的内置查找程序只能与单个列匹配。

在表单中定义输入:

<?= $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()的第三个参数删除身份验证器生成的可能现有条件,或者覆盖它们,如本例所示。

另见

答案 1 :(得分: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);
}