2013-07-31 15 views
7

W moim obecnym systemie muszę się zalogować przy użyciu nazwy użytkownika lub adresu e-mail i hasła. Czy ktoś wie o tym, jak to osiągnąć?Logowanie CakePHP przez nazwę użytkownika lub e-mail przy użyciu komponentu Auth

moja forma:

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

      ) 
     ) 
    ); 

Daj mi znać, co jeszcze muszę zrobić .. ??

Odpowiedz

4

prostu możemy to zrobić przed działaniem logowania logowania:

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

Jest to również przydatne, gdy masz e-maile, ale nie masz nazwy użytkownika. – Amjo

5

Nie jestem pewien, co etykieta jest delegowania odpowiedzi na stare pytania, ale oto, co zrobiłem w tym celu.

W mojej funkcji logowania

 $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']; 
     } 
+1

Zapraszamy do odpowiedzi na stare pytania. Nawet jeśli osoba pytająca może już nie potrzebować pomocy, pomożesz przyszłym odwiedzającym. – dcastro

0

znalazłem to rozwiązanie użyteczne. Stworzyłem dwie klasy, które rozszerzają FormAuthenticate:

APP/Controller/Component/Auth/ClassNameAuthenticate.php i

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class ClassNameAuthenticate extends FormAuthenticate { 
} 

app/kontroler/Component/Auth/ClassNameEmailAuthenticate.php

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class ClassNameEmailAuthenticate extends FormAuthenticate { 
} 

następnie w moim kontrolerze dodano komponent Auth do $ 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) 
      )     
     ) 
    ), 
); 

logowanie widok: 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> 

i login() Działanie:

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

Mam nadzieję, że ktoś znajdzie to użyteczne.

2

Znalazłem następujący kod z tego url. Myślę, że jest to najlepsze w sensie prostoty. Użyj poniższy kod na swojej logowania działania:

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 */ 
     } 
    } 
} 

A także użyć następującego kodu do logowania.CTP:

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

Może wyglądać jak włamanie, ale jest to "prawie poprawna" odpowiedź, chyba że mają bardziej "elegancki" sposób na zrobienie tego. –

0

to jest moje rozwiązanie, aby rozwiązać ten 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'); 
} 
2

Zakładając masz nazwa i email oba pola w tabeli użytkowników

W twój AppController.php

Ten kod będzie działał dla CakePHP 2.x, nie testowany na wersji 3.x, powinieneś mieć pole e-mail w tabeli użytkownika.

Powiązane problemy