Использование имени пользователя вместо электронной почты в компоненте аутентификации CakePHP - PullRequest
3 голосов
/ 06 августа 2011

Используя компонент аутентификации CakePHP, как я могу разрешить пользователям проходить аутентификацию, используя в качестве имени пользователя либо поле "username", либо "email", а поле "pass" в качестве пароля?

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

что означает "использование (имя пользователя и адрес электронной почты) в качестве имени пользователя"?

Редактировать: хорошо, так что вы хотите, чтобы Auth просматривал оба поля username и email в db для сравнения с "username", которое вводит пользователь? затем сделайте это:

function beforeFilter() {
  parent::beforeFilter();
  $this->Auth->fields = array('username' => 'username', 'password' => 'pass');
  $this->Auth->autoRedirect = false;
}
function login(){
  if ($this->Auth->user()) {
     $this->redirect($this->Auth->redirect());
  } else if (!empty($this->data)) {
     $this->Auth->fields = array('username' => 'email', 'password' => 'pass');
     $this->data['User']['email'] = $this->data['User']['username'];
     if($this->Auth->login($this->data))$this->redirect($this->Auth->redirect());
  }
}
3 голосов
/ 06 августа 2011

Чтобы сделать это, вы должны пропустить Auths autoredirect и управлять им самостоятельно. Это действие входа в ваш users_controller:

public function login() {
    if(!empty($this->data)) { // Submitted form

        // Try to login with Email
        if(!$this->Auth->user() // if user wasn't logged in with username + pass
            && !empty($this->Auth->data['User']['username'])
            && !empty($this->Auth->data['User']['password'])
        ) {
            $user = $this->User->find('first', array(
                'conditions' => array(
                    'User.email' => $this->Auth->data['User']['username'],
                    'User.password' => $this->Auth->data['User']['password']
                ),
                'recursive' => -1
            ));

            if(!empty($user) && $this->Auth->login($user)) {
                // They logged in, so kill the flash error message
                $this->Session->delete('Message.auth');
            } else {
                $this->Session->setFlash($this->Auth->loginError, $this->Auth->flashElement, array(), 'auth');
            }
        }

        if($this->Auth->user()) {
            // Post login logic here
            $this->redirect($this->Auth->redirect());
        }

    } else {
        if($this->Auth->user()) {
            $this->Session->setFlash(__d('users', 'You are already registered and logged in!', true));
            //$this->redirect('/');
            $this->redirect($this->Auth->redirect());
        }
    }

Это было скопировано прямо из моего приложения, так что, возможно, вам понадобится немного настроить его. Не забудьте установить $this->Auth->autoRedirect = false; в вашем контроллере приложений: beforeFilter ();

Вы должны помнить, что Auth будет автоматически проверять имя пользователя и пароль, поэтому это действие только начинается с этого. Вызов Session::remove() состоит в том, чтобы автоматически удалить сообщение об ошибке Auth, оставленное при неудачной проверке имени пользователя / пароля, и успешной регистрации по электронной почте (в противном случае вы получаете сообщения об ошибках при успешном входе в систему).

...