自定义查找器不在CakePHP 3中工作

时间:2017-01-30 03:10:53

标签: authentication cakephp cakephp-3.3

我正在开发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()操作

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

  

更新2

users表格中添加了空白列<?php echo $this->Form->create(); echo $this->Form->input('username'); echo $this->Form->input('password'); echo $this->Form->submit(); echo $this->Form->end(); ?>

login.ctp

public function findAuth(Query $query, array $options)
{
    $query
        ->orWhere(['Users.email' => $options['username']])
        ->orWhere(['Users.mobile' => $options['username']]);

    return $query;
}

AppController.php:authComponent

与上述相同

findAuth()

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; } 列。

1 个答案:

答案 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'