Войти с адресом электронной почты или именем пользователя в CakePHP v2.0 - PullRequest
0 голосов
/ 16 января 2012

В CakePHP до версии 2.0 вы могли разрешить пользователю входить в систему, используя свой адрес электронной почты, остановив autoRedirect и затем сравнив данные имени пользователя со столбцом электронной почты в вашей базе данных (очевидно, Cake может затем вернуться к проверке имени пользователя, если не к электронной почте).

В CakePHP 2.0 это изменилось, и вы входите вручную, используя $this->Auth->login()

Мой вопрос: как мне заставить это работать для 2.0?У меня есть довольно сложный код, который выполняет различные функции, такие как обработка запросов ajax и postback, блокировка учетных записей, если пользователь пытается войти в систему слишком много раз и т. Д., Поэтому он довольно длинный!

Как вы увидите, я проверяюесли учетная запись фактически существует вручную, поэтому я могу показать сообщение учетной записи, не найденное до прохождения процесса аутентификации, если это так, а также использовать его для блокировки учетной записи этого пользователя при 5 неудачных попытках.

Основнойпроблема здесь заключается в том, что система позволяет проверять как имена пользователей, так и адреса электронной почты для аутентификации. Система на месте блокирует пользователя, если вы используете адрес электронной почты, так как он обрабатывает его в упомянутой проверке, но он всегда будет неудачным, потому что аутентификация не может обработатьэто.

Надеюсь, кто-то может помочь, предложить идеи советы.Спасибо

if ($this->request->is('post'))
        {       
            $opts = array(
               'conditions'=>array(
                   'OR'=>array(
                      'User.username'=>$this->data['User']['username'],
                      'User.email'=>$this->data['User']['username']
                    )
                )
            );

            $user = $this->User->find('first', $opts);

            if(!empty($user))
            {
                if($user['User']['status'] == 0)
                {
                    if($this->request->is('ajax'))
                    {
                        $this->autoRender = false;
                        echo json_encode(array('authenticated'=>false,'error'=>__('Sorry your account is currently locked. Please reset your password.?')));
                    }
                    else
                    {
                        $this->Session->setFlash(__('Sorry your account is currently locked. Please reset your password.'), 'default', array(), 'auth');
                    }
                }
                else
                {   
                    if ($this->Auth->login())
                    {   
                        if ($this->request->is('ajax'))
                        {   
                            $this->autoRender = false;
                            if(isset($this->params['url']['continue']))
                            {
                                $pathtoredirect = $this->UrlEncode->base64url_decode($this->params['url']['continue']);

                                echo json_encode(array('authenticated'=>true,'redirect'=>$pathtoredirect,'base'=>false));
                            }
                            else
                            {
                                $pathtoredirect = $this->Auth->redirect();

                                echo json_encode(array('authenticated'=>true,'redirect'=>$pathtoredirect,'base'=>true));
                            }
                        }
                        else
                        {
                            if(isset($this->params['url']['continue']))
                            {
                                $pathtoredirect = $this->UrlEncode->base64url_decode($this->params['url']['continue']);
                            }
                            else
                            {
                                $pathtoredirect = $this->Auth->redirect();
                            }
                            return $this->redirect($pathtoredirect);
                        }               
                    }
                    else
                    {               
                        if($this->Session->read('attempts'))
                        {
                            $attempts = $this->Session->read('attempts') + 1;
                        }
                        else
                        {
                            $attempts = 1;
                        }

                        $this->Session->write('attempts', $attempts);

                        if($attempts >= 5)
                        {
                            $this->User->id = $user['User']['id'];
                            $this->User->saveField('status', 0);
                            if ($this->request->is('ajax'))
                            {
                                $this->autoRender = false;
                                echo json_encode(array('authenticated'=>false,'error'=>__('Username or password is incorrect. For security reasons this account has now been locked and you must reset your password to unlock it.')));
                            }
                            else
                            {
                                $this->Session->setFlash(__('Username or password is incorrect. For security reasons this account has now been locked and you must reset your password to unlock it.'), 'default', array(), 'auth');
                            }
                        }
                        else
                        {
                            if ($this->request->is('ajax'))
                            {
                                $this->autoRender = false;
                                echo json_encode(array('authenticated'=>false,'error'=>__('Username or password is incorrect')));
                            }
                            else
                            {
                                $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
                            }
                        }
                    }
                }
            }
            else
            {
                if ($this->request->is('ajax'))
                {
                    $this->autoRender = false;
                    echo json_encode(array('authenticated'=>false,'error'=>__('Sorry that account does not exist.')));
                }
                else
                {
                    $this->Session->setFlash(__('Sorry that account does not exist.'), 'default', array(), 'auth');
                }
            }
        }

1 Ответ

3 голосов
/ 16 января 2012

Я не уверен, можно ли настроить AuthComponent для автоматической проверки двух полей, но есть альтернатива:

/*
* AppController
*/
beforeFilter()
{
    $this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email', 'password' => 'password')));
}

/*
* UsersController
*/
function login()
{
  if($this->request->is('post'))
  {
    $logged_in = false;

    if($this->Auth->login())
    {
      $logged_in = true;
    }
    else
    {
      $this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'username', 'password' => 'password')));
      $this->Auth->constructAuthenticate();

      $this->request->data['User']['username'] = $this->request->data['User']['email']; 

      if($this->Auth->login())
      {
          $logged_in = true;
      }
    }

    if($logged_in)
    {
      /*
       * Do what you want here
       */
    }
    else
    {
      /*
       * Do what you want here
       */
    }
  }
}

Тогда, конечно, если вы хотите иметь возможность выполнить только один тест для проверки обоих полей, вы можете переместить этот код в Компонент вместо прямого вызова метода $this->Auth->login().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...