CakePHP使用Auth组件按用户名或电子邮件登录

jsd*_*iya 9 cakephp

在我目前的系统中,我需要使用用户名或电子邮件和密码登录.任何人都知道如何实现这一目标?

我的表格:

<?php echo $this->Form->create('User', array('action' => 'login'));
  echo $this->Form->input('username', array('class' => 'TextField js-user-mode'));
 echo $this->Form->input('password', array('class' => 'TextField')); 
?>
Run Code Online (Sandbox Code Playgroud)

我的AppController:

public $components = array(


        'Email'=>array(),
        'Auth'              => array(
            'loginAction'       => array(
                'admin'             => false,
                'controller'        => 'users',
                'action'            => 'login'
            ),
            'authError'     => 'Your session has ended due to inactivity.  Please login to continue.',
            'authenticate'  => array(
                'Form'          => array(
                    'fields'        => array('username' => array('username','email')),
                ),
                'all' => array(
                    'userModel' => 'User',
                    'scope' => array('User.status' =>array('active'))
                )

            )
        )
    ); 
Run Code Online (Sandbox Code Playgroud)

让我知道我还需要做什么.. ??

小智 6

我不确定在发布旧问题的答案时礼仪是什么,但这就是我为此所做的.

在我的登录功能

        $username  = $this->data['User']['username'];
        $password = $this->request->data['User']['password'];

        $user = $this->User->findByUsername($username);
        if (empty($user)) {
            $user = $this->User->findByEmail($username);

            if (empty($user)) {
                $this->Session->setFlash(__('Incorrect Email/Username or Password'));
                return;
            }
            $this->request->data['User']['username'] = $user['User']['username'];
        }
Run Code Online (Sandbox Code Playgroud)

  • 非常欢迎您回答旧问题。即使请求者可能不再需要帮助,您也将帮助未来的访客。 (2认同)

jsd*_*iya 4

我们可以在您的身份验证登录操作之前执行此操作:

$emailUsername = @$this->request->data['User']['email'];
if (!filter_var($emailUsername, FILTER_VALIDATE_EMAIL)) { 
    $emailFromUsername = $this->User->find('first', array('conditions' => array('User.username' => $emailUsername), 'recursive' => -1, 'fields' => array('email')));
    //pr($emailFromUsername );
    if (!empty($emailFromUsername)) {
        $emailFromUsernameDB = $emailFromUsername['User']['email'];
    } else {
        $emailFromUsername = '';
    }
    $this->request->data['User']['email'] = $emailFromUsername;
}
Run Code Online (Sandbox Code Playgroud)