Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CakePHP login by Username Or Email using Auth component

Tags:

cakephp

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..??

like image 859
jsduniya Avatar asked Jul 31 '13 18:07

jsduniya


4 Answers

I found following code from this url. I think this is the best in sense of simplicity. Use following code on your login action:

public function login() {
    if($this->request->is('post')&&!empty($this->request->data)) {
        App::Import('Utility', 'Validation');
        if( isset($this->data['User']['username']) && Validation::email($this->request->data['User']['username'])) {
            $this->request->data['User']['email'] = $this->request->data['User']['username'];
            $this->Auth->authenticate['Form'] = array('fields' => array('username' => 'email'));
        }
        if($this->Auth->login()) {
            /* login successful */
            $this->redirect($this->Auth->redirect());
        } else {
            /* login unsuccessful */
        }
    }
}

And also use following code for login.ctp :

<?php
    echo $this->form->create('User');
    echo $this->form->input('username');
    echo $this->form->input('password');
    echo $this->form->end('Submit');
?>
like image 192
monsur.hoq Avatar answered Nov 12 '22 04:11

monsur.hoq


I'm not sure what the etiquette is on posting answers to old questions but here's what I did for this.

In my login function

        $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'];
        }
like image 7
Roberto Herrera Avatar answered Nov 12 '22 04:11

Roberto Herrera


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;
}
like image 4
jsduniya Avatar answered Nov 12 '22 04:11

jsduniya


Assuming you have username and email both fields in your users table

In your AppController.php

public function beforeFilter() {
    if ($this->request->is('post') && $this->action == 'login') {
        $username = $this->request->data['User']['username'];
        if (filter_var($username, FILTER_VALIDATE_EMAIL)) {
            $this->Auth->authenticate['Form']['fields']['username'] = 'email';
            $this->request->data['User']['email'] = $username;
            unset($this->request->data['User']['username']);
        }
    }
}

This code will work for CakePHP 2.x, not tested on version 3.x, you should have email field in your user's table.

like image 2
Edris Avatar answered Nov 12 '22 04:11

Edris