我想使用多个字段检查登录。
当前情况:使用(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
我的期望:使用(Phone
或Password
)和(<div>
<input name="email_or_phone" placeholder="Email or Phone">
<input name="password" placeholder="Password">
<input type="submit" value="Login">
</div>
)字段进行登录
isodepth
如何配置 AuthComponent 以应对这种情况?
答案 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);
}