我正在开发CakePHP 3.3。我希望用户使用电子邮件或手机号码以及密码进行登录。
我的用户表包含email, mobile, password, etc
个字段。
根据CakePHP doc,我正在使用自定义查找程序auth
登录。
Auth
AppController.php
$this->loadComponent('Auth', [
'loginRedirect' => [
'controller' => 'Dashboard',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'home'
],
'authenticate' => [
'Form' => [
'finder' => 'auth'
]
]
]);
组件
findAuth()
UsersTable.php
中的 和public function findAuth(Query $query, array $options)
{
$query
->select(['id', 'email', 'mobile', 'password'])
->where(['Users.email' => $options['login']])
->orWhere(['Users.mobile' => $options['login']]);
return $query;
}
操作
UsersController.php
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->registerError(__('Invalid Credentials, try again'), ['key' => 'registration']);
}
}
和login()操作
但这不起作用并打印 更新2 在 login.ctp AppController.php:authComponent 与上述相同 findAuth() 现在它正在运作。但是,即使在应用程序中不需要,也可以强制使用login.ctp
<?php
echo $this->Form->create();
echo $this->Form->input('login');
echo $this->Form->input('password');
echo $this->Form->submit();
echo $this->Form->end();
?>
视图包含 Invalid Credentials, try again
username
users
表格中添加了空白列<?php
echo $this->Form->create();
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->submit();
echo $this->Form->end();
?>
。public function findAuth(Query $query, array $options)
{
$query
->orWhere(['Users.email' => $options['username']])
->orWhere(['Users.mobile' => $options['username']]);
return $query;
}
username
function array_merge_custom($array1,$array2) {
$mergeArray = [];
$array1Keys = array_keys($array1);
$array2Keys = array_keys($array2);
$keys = array_merge($array1Keys,$array2Keys);
foreach($keys as $key) {
$mergeArray[$key] = array_merge_recursive(isset($array1[$key])?$array1[$key]:[],isset($array2[$key])?$array2[$key]:[]);
}
return $mergeArray;
}
列。
答案 0 :(得分:1)
您必须选择验证用户所需的所有字段,如doc所述。
var page = new Page1View();
NavigationPage.SetIconTitle(page, "foo.png");
请确保public function findAuth(Query $query, array $options)
{
$query
->select(['id', 'email', 'mobile', 'username', 'password'])
->orWhere(['Users.email' => $options['login']])
->orWhere(['Users.mobile' => $options['login']]);
return $query;
}
在您的表单上。
<强>更新强> 如果您正在使用&#39; login&#39;作为表单输入尝试使用:
$options['login']
fields用于标识用户的字段。您可以使用密钥用户名和密码分别指定用户名和密码字段。
使用我的应用程序自己的查询(没有 'authenticate' => [
'Form' => [
'finder' => 'auth',
'fields' => ['username' => 'login', 'password' => 'password']
]
]
):
fields => [username => login]
我的登录信息类似,但使用的是用户名和电子邮件,而不是您的字段。
更新2:
文档不是很好。所以测试我认为默认情况下使用自定义查找程序将通过Cake添加第一个SELECT
Users.id AS `Users__id`,
Users.username AS `Users__username`,
Users.password AS `Users__password`,
Users.role AS `Users__role`,
Users.email AS `Users__email`
FROM
users Users
WHERE
(
Users.email = 'user@example.com'
OR (
Users.username = 'user@example.com'
AND Users.username = 'user@example.com'
)
)
来修改查询,然后解决方案是在所有其他人上使用orWhere(findAuth已修改)。
新查询:
WHERE this = 'something'