2017-01-30 45 views
0

我正在CakePHP 3.3上工作。我希望用户登录使用电子邮件手机号码连同密码自定义查找器不能在CakePHP 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.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

Update 2

增加了一个空白列usernameusers表。

login.ctp

<?php 
    echo $this->Form->create(); 
    echo $this->Form->input('username'); 
    echo $this->Form->input('password'); 
    echo $this->Form->submit(); 
    echo $this->Form->end(); 
?> 

AppController.php:authComponent

同上

findAuth()

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

    return $query; 
} 

现在工作。但是为什么强制使用username列即使在应用程序中不需要。

+0

我用不同的方法测试,这里没有工作too..maybe CakePHP的不适合某些版本的支持和文档是不是很够本。 –

回答

0

doc所述,您必须选择所有需要验证用户身份的字段。

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

并确保$options['login']在您的窗体上。

更新: 如果您正在使用 '登录' 作为表单输入尝试使用:

 'authenticate' => [ 
      'Form' => [ 
       'finder' => 'auth', 
       'fields' => ['username' => 'login', 'password' => 'password'] 
      ] 
     ] 

fields The fields to use to identify a user by. You can use keys username and password to specify your username and password fields respectively.

我自己的查询中使用我的应用程序(不fields => [username => login]):

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 = '[email protected]' 
    OR (
     Users.username = '[email protected]' 
     AND Users.username = '[email protected]' 
    ) 
) 

我的登录类似,但使用用户名和电子邮件,而不是您的字段。

更新2: 该文档不是很好。因此,测试我发现默认情况下使用自定义查找器,查询将由Cake添加第一个WHERE this = 'something'进行修改,然后该解决方案对所有其他(findAuth修改)使用orWhere。

新查询:

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' 
    OR Users.username = 'user' 
) 
+0

曾尝试使用'select',但没有运气... upadted问题与选择 – Gaurav

+0

我做了完全在我的应用程序,它的工作原理,你确定['登录']这是你的表单域?...更新。 –

+0

你怎么知道在验证过程中同时使用'finder'和'fields'?这就是技巧和+1,这很好。 –