CakePHP使用Auth组件按用户名或电子邮件登录

时间:2013-07-31 18:19:27

标签: cakephp

在我目前的系统中,我需要使用用户名或电子邮件和密码登录。 任何人都知道如何实现这个目标吗?

我的表格:

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

            )
        )
    ); 

让我知道我还需要做什么.. ??

7 个答案:

答案 0 :(得分:5)

不确定在发布旧问题的答案时礼仪是什么,但这就是我为此所做的。

在我的登录功能

        $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 :(得分:4)

我们可以在您的Auth登录操作之前执行此操作:

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

答案 2 :(得分:2)

答案 3 :(得分:2)

我从url找到了以下代码。我认为这是最简单的感觉。在登录操作中使用以下代码:

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

并使用以下代码 login.ctp

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

答案 4 :(得分:2)

  

假设您的用户表格中有用户名电子邮件这两个字段

在你的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']);
        }
    }
}

此代码适用于CakePHP 2.x,未在3.x版本上测试过,您的用户表中应该有电子邮件字段。

答案 5 :(得分:0)

我发现此解决方案很有用。 我创建了两个扩展FormAuthenticate的类:

app / Controller / Component / Auth / ClassNameAuthenticate.php

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

class ClassNameAuthenticate extends FormAuthenticate {
}

应用/控制器/组件/认证/ ClassNameEmailAuthenticate.php

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

class ClassNameEmailAuthenticate extends FormAuthenticate {
}

然后在我的Controller中将Auth Component添加到$ 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)
            )                
        )
    ),
);

登录视图: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()操作:

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

我希望有人会觉得这很有用。

答案 6 :(得分:0)

这是解决该问题的解决方案

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