CakePHP by username or email using the Auth component

On my current system, I need to log in using a username or email address and password. can anyone know about this, how to do it?

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')) ) ) ) ); username' => array ( 'username', 'email')), 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')) ) ) ) ); , 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.

+7
cakephp
source share
7 answers

Simply, we can make it to your entry action Auth system:

 $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; } FILTER_VALIDATE_EMAIL)) { $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; } find ( 'first', array ( 'conditions' => array ( 'User.username' => $ emailUsername), 'recursive' => -1, 'fields' => array $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; } ) { $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; } User'] [ 'email'] = $ emailFromUsername; $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; } 
+4
source share

I'm not sure what the etiquette when sending answers to the old questions, but here's what I have done 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']; } 'User'] [ 'username'];  $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']; } data [ 'User'] [ 'password'];  $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']; } ( 'Incorrect Email / Username or Password'));  $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']; } 
+5
source share
+2
source share

I found the following code from this url . I think this is the best in terms of simplicity. Use the following code in the 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 */ } } } ( 'post') &&! empty ($ this-> request-> data)) { 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 */ } } } 'Validation'); 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 */ } } } User'] [ 'email'] = $ this-> request-> data [ 'User'] [ 'username']; 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 */ } } } ()) { 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 */ } } } 

Also, use the following code to login.ctp:

 <?php echo $this->form->create('User'); echo $this->form->input('username'); echo $this->form->input('password'); echo $this->form->end('Submit'); ?> 
+2
source share

Assuming that you have a user name and e-mail both fields in your user 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 an email field in your user table.

+2
source share

I found this solution helpful. I created two classes that extend FormAuthenticate:

app / Controller / Component / Auth / ClassNameAuthenticate.php and

 <?php App::uses('FormAuthenticate', 'Controller/Component/Auth'); class ClassNameAuthenticate extends FormAuthenticate { } 

app / controller / component / Auto / ClassNameEmailAuthenticate.php

 <?php App::uses('FormAuthenticate', 'Controller/Component/Auth'); class ClassNameEmailAuthenticate extends FormAuthenticate { } 

in my controller added Auth component in the $ components

 public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); , public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); , public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); ClassName.active' => public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); , public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); , public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); ClassName.active' => public $components = array( 'Session', 'Auth' => array( 'authenticate' => array( 'ClassName' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'username', ), 'scope' => array('ClassName.active' => 1) ), 'ClassNameEmail' =>array( 'userModel'=>'ClassName', 'fields' => array( 'username' => 'email', ), 'scope' => array('ClassName.active' => 1) ) ) ), ); 

login view: login.ctp

 <div class="form"> <?php echo $this->Form->create('ClassName'); ?> <fieldset> <legend><?php echo __('Login'); ?></legend> <?php echo $this->Form->input('username'); echo $this->Form->input('password'); ?> </fieldset> <?php echo $this->Form->end(array('label'=>__('Login'))); ?> </div> 'Login')?; <div class="form"> <?php echo $this->Form->create('ClassName'); ?> <fieldset> <legend><?php echo __('Login'); ?></legend> <?php echo $this->Form->input('username'); echo $this->Form->input('password'); ?> </fieldset> <?php echo $this->Form->end(array('label'=>__('Login'))); ?> </div> 'username'); <div class="form"> <?php echo $this->Form->create('ClassName'); ?> <fieldset> <legend><?php echo __('Login'); ?></legend> <?php echo $this->Form->input('username'); echo $this->Form->input('password'); ?> </fieldset> <?php echo $this->Form->end(array('label'=>__('Login'))); ?> </div> 

and login ():

  public function login(){ if ($this->Auth->loggedIn()) { return $this->redirect($this->Auth->redirect()); } if ($this->request->is('post')) { //Need to duplicate field email for ClassNameEmail Auth $this->request->data['ClassName']['email'] = $this->request->data['ClassName']['username']; if ($this->Auth->login()) { return $this->redirect($this->Auth->redirect()); } $this->Session->setFlash(__('Invalid username/email or password, try again')); } } ClassName'] [ 'email'] = $ this-> request-> data [ 'ClassName'] [ 'username'];  public function login(){ if ($this->Auth->loggedIn()) { return $this->redirect($this->Auth->redirect()); } if ($this->request->is('post')) { //Need to duplicate field email for ClassNameEmail Auth $this->request->data['ClassName']['email'] = $this->request->data['ClassName']['username']; if ($this->Auth->login()) { return $this->redirect($this->Auth->redirect()); } $this->Session->setFlash(__('Invalid username/email or password, try again')); } } 

I hope someone will find it useful.

0
source share

this is my solution to solve this problem

 public function login(){ if($this->request->is('post')){ $this->User->set($this->request->data); if($this->User->validates()){ if(Validation::email($this->data['User']['username'])){ $this->Auth->authenticate['Form'] = array_merge($this->Auth->authenticate['Form'],array('fields'=>array('username'=>'email'))); $this->request->data['User']['email'] = $this->request->data['User']['username']; unset($this->request->data['User']['username']); } if($this->Auth->login()){ $this->User->id = $this->Auth->user('id'); $this->User->saveField('last_login',time()); if($this->data['User']['remember']){ unset($this->request->data['User']['remember']); $this->request->data['User']['password'] = Security::hash($this->request->data['User']['password'],'blowfish'); $this->Cookie->write('rememberMe',$this->request->data['User'],true,'2 days'); } $this->redirect($this->Auth->loginRedirect); } $this->Session->setFlash('Invalid Username or Password entered, please try again.','default',array('class'=>'alert alert-warning'),'warning'); } } $this->set('title','Login Page'); } this-> request-> data); public function login(){ if($this->request->is('post')){ $this->User->set($this->request->data); if($this->User->validates()){ if(Validation::email($this->data['User']['username'])){ $this->Auth->authenticate['Form'] = array_merge($this->Auth->authenticate['Form'],array('fields'=>array('username'=>'email'))); $this->request->data['User']['email'] = $this->request->data['User']['username']; unset($this->request->data['User']['username']); } if($this->Auth->login()){ $this->User->id = $this->Auth->user('id'); $this->User->saveField('last_login',time()); if($this->data['User']['remember']){ unset($this->request->data['User']['remember']); $this->request->data['User']['password'] = Security::hash($this->request->data['User']['password'],'blowfish'); $this->Cookie->write('rememberMe',$this->request->data['User'],true,'2 days'); } $this->redirect($this->Auth->loginRedirect); } $this->Session->setFlash('Invalid Username or Password entered, please try again.','default',array('class'=>'alert alert-warning'),'warning'); } } $this->set('title','Login Page'); } User'] [ 'email'] = $ this-> request-> data [ 'User'] [ 'username']; public function login(){ if($this->request->is('post')){ $this->User->set($this->request->data); if($this->User->validates()){ if(Validation::email($this->data['User']['username'])){ $this->Auth->authenticate['Form'] = array_merge($this->Auth->authenticate['Form'],array('fields'=>array('username'=>'email'))); $this->request->data['User']['email'] = $this->request->data['User']['username']; unset($this->request->data['User']['username']); } if($this->Auth->login()){ $this->User->id = $this->Auth->user('id'); $this->User->saveField('last_login',time()); if($this->data['User']['remember']){ unset($this->request->data['User']['remember']); $this->request->data['User']['password'] = Security::hash($this->request->data['User']['password'],'blowfish'); $this->Cookie->write('rememberMe',$this->request->data['User'],true,'2 days'); } $this->redirect($this->Auth->loginRedirect); } $this->Session->setFlash('Invalid Username or Password entered, please try again.','default',array('class'=>'alert alert-warning'),'warning'); } } $this->set('title','Login Page'); } User'] [ 'remember']) { public function login(){ if($this->request->is('post')){ $this->User->set($this->request->data); if($this->User->validates()){ if(Validation::email($this->data['User']['username'])){ $this->Auth->authenticate['Form'] = array_merge($this->Auth->authenticate['Form'],array('fields'=>array('username'=>'email'))); $this->request->data['User']['email'] = $this->request->data['User']['username']; unset($this->request->data['User']['username']); } if($this->Auth->login()){ $this->User->id = $this->Auth->user('id'); $this->User->saveField('last_login',time()); if($this->data['User']['remember']){ unset($this->request->data['User']['remember']); $this->request->data['User']['password'] = Security::hash($this->request->data['User']['password'],'blowfish'); $this->Cookie->write('rememberMe',$this->request->data['User'],true,'2 days'); } $this->redirect($this->Auth->loginRedirect); } $this->Session->setFlash('Invalid Username or Password entered, please try again.','default',array('class'=>'alert alert-warning'),'warning'); } } $this->set('title','Login Page'); } Auth-> loginRedirect); public function login(){ if($this->request->is('post')){ $this->User->set($this->request->data); if($this->User->validates()){ if(Validation::email($this->data['User']['username'])){ $this->Auth->authenticate['Form'] = array_merge($this->Auth->authenticate['Form'],array('fields'=>array('username'=>'email'))); $this->request->data['User']['email'] = $this->request->data['User']['username']; unset($this->request->data['User']['username']); } if($this->Auth->login()){ $this->User->id = $this->Auth->user('id'); $this->User->saveField('last_login',time()); if($this->data['User']['remember']){ unset($this->request->data['User']['remember']); $this->request->data['User']['password'] = Security::hash($this->request->data['User']['password'],'blowfish'); $this->Cookie->write('rememberMe',$this->request->data['User'],true,'2 days'); } $this->redirect($this->Auth->loginRedirect); } $this->Session->setFlash('Invalid Username or Password entered, please try again.','default',array('class'=>'alert alert-warning'),'warning'); } } $this->set('title','Login Page'); } 
0
source share

All Articles