Search code examples
phpcakephp

CakePHP login by Username Or Email using Auth component


In my present system I need to login using username or email and password. can anybody knows how to achieve this ?

My Form:

<?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')); 
?>

MY 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'))
                )

            )
        )
    ); 

Let me know what else i need to do..??


Solution

  • Simply we can do this before your Auth login action:

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