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