我想使用多个字段检查登录。
当前情况:使用(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'
]);
我的期望:使用(Email
或Phone
)和(Password
)字段登录
<div>
<input name="email_or_phone" placeholder="Email or Phone">
<input name="password" placeholder="Password">
<input type="submit" value="Login">
</div>
如何配置AuthComponent以满足这种情况?
如果要基于“任一或”基础进行身份验证,则必须使用自定义查找程序,因为身份验证程序的内置查找程序仅用于匹配单个列。
在您的表单中定义输入:
<?= $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()
的第三个参数删除验证器生成的可能现有条件,或者在本示例中显示它们。
也可以看看
请尝试以下方法:
$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);
}