2013-07-31 39 views
7

Trong hệ thống hiện tại của tôi, tôi cần đăng nhập bằng tên người dùng hoặc email và mật khẩu. ai cũng có thể biết về cách này để đạt được điều này?Đăng nhập CakePHP bằng Tên người dùng hoặc Email bằng thành phần Auth

biểu mẫu của tôi:

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

      ) 
     ) 
    ); 

Hãy cho tôi biết những gì khác tôi cần phải làm .. ??

Trả lời

4

Đơn giản chỉ cần chúng ta có thể làm được điều này trước khi action login Auth của bạn:

$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

Điều này cũng hữu ích khi bạn có email nhưng không có tên người dùng. – Amjo

5

Tôi không chắc chắn những gì các nghi thức là về niêm yết câu trả lời cho câu hỏi cũ nhưng đây là những gì tôi đã làm cho việc này.

Trong chức năng đăng nhập của tôi

 $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

Bạn được chào đón nhiều hơn để trả lời các câu hỏi cũ. Ngay cả khi người hỏi có thể không cần trợ giúp nữa, bạn sẽ giúp đỡ những khách truy cập trong tương lai. – dcastro

0

tôi tìm thấy giải pháp này hữu ích. Tôi đã tạo ra hai lớp mà mở rộng FormAuthenticate:

app/Controller/Component/Auth/ClassNameAuthenticate.php

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

class ClassNameAuthenticate extends FormAuthenticate { 
} 

app/Controller/Component/Auth/ClassNameEmailAuthenticate.php

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

class ClassNameEmailAuthenticate extends FormAuthenticate { 
} 

khi đó trong Trình điều khiển của tôi đã thêm Thành phần xác thực vào $ thành phần

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) 
      )     
     ) 
    ), 
); 

xem đăng nhập: 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> 

và đăng nhập() hành động:

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

Tôi hy vọng ai đó sẽ tìm thấy điều này hữu ích.

2

Tôi tìm thấy mã sau đây từ số url này. Tôi nghĩ đây là cách đơn giản nhất. Sử dụng đoạn mã sau vào đăng nhập hành động của bạn:

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

Và cũng sử dụng mã sau đây cho đăng nhập.ctp:

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

Có thể trông giống như một hack nhưng nó là một câu trả lời "gần đúng" trừ khi họ có một cách "thanh lịch" hơn để làm điều đó. –

0

đây là giải pháp của tôi để giải quyết vấn đề đó

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

Giả sử bạn có Tên truy nhậpemail cả các trường trong bảng người dùng của bạn

Trong AppController.php

của bạn
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']); 
     } 
    } 
} 

Mã này sẽ hoạt động cho CakePHP 2.x, không được thử nghiệm trên phiên bản 3.x, bạn nên có trường email trong bảng của người dùng.

Các vấn đề liên quan