Почему в CakePHP не работает автоматический вход в систему с именем пользователя и паролем Auth Component, как ожидалось?

Я пытаюсь создать страницу регистрации входа для своего веб-сайта, у меня возникают проблемы с компонентом аутентификации,

function beforeFilter() {
    $this->Auth->loginAction = array('controller'=>'users','action'=>'login');
    $this->Auth->loginRedirect = array('controller'=>'users','action'=>'landing');
    $this->Auth->logoutRedirect = array('controller'=>'users','action'=>'home');

    // These pages do not require authenication<br/>
    $this->Auth->allow('home','register','activate','forgot','reset','_sendEmail','reset');
}

Я шифрую и храню пароли в базе данных, используя метод $this->Auth->password, теперь, даже когда я успешно вхожу в систему, я не перенаправляюсь на целевую страницу под контроллером пользователей, я попытался распечатать $this->Auth, и он говорит

[loginError] => Login failed. Invalid username or password.
[authError] => You are not authorized to access that location.

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

Я не могу понять, что я делаю неправильно, даже после входа в систему, если я пытаюсь указать свой браузер на http://cake.localhost/users/register он должен автоматически перенаправить меня на целевую страницу, но по какой-то причине этого не происходит.

Любые подсказки относительно того, где я иду не так?

Шив


person Shiv    schedule 06.06.2009    source источник
comment
Могу ли я предположить, что это находится внутри app_controller.php? Вы случайно не добавили этот контроллер в качестве акоса для авторизации? Затем вам, возможно, придется пойти и убедиться, что всем группам пользователей разрешено просматривать это сообщение.   -  person codingbear    schedule 06.06.2009
comment
Это внутри UsersController   -  person Shiv    schedule 06.06.2009
comment
loginAction/loginRedirect/logoutRedirect должен быть внутри app_controller’s beforeFilter().. по крайней мере, это то, что я считаю лучшим дизайном   -  person codingbear    schedule 07.06.2009
comment
да, без сомнения, это устранило некоторые странные ошибки, которые я получал   -  person Shiv    schedule 07.06.2009
comment
var $components=array('Auth'); даже если это добавлено в app_controller, я получаю сообщение об ошибке, говорящее о вызове неопределенного метода stdClass::allow(), когда $components задается в userscontoller, тогда не будет никакой ошибки, почему так бывает???   -  person RSK    schedule 14.04.2010


Ответы (5)


Из кулинарной книги CakePHP:

По умолчанию AuthComponent ожидает, что у вас будет таблица с именем «пользователи» с полями «имя пользователя» и «пароль», которые будут использоваться.

Интересно, сработает ли автомагия, если вы используете email в качестве имени поля?

Попробуйте добавить это в свой фильтр перед фильтром:

function beforeFilter() {
    $this->Auth->fields = array(
        'username' => 'email', 
        'password' => 'password'
    );
}
person SteD    schedule 11.06.2009

Попробуйте $this->Auth->allowedActions = array('*'); в контроллере beforeFilter() (не в app_controller).

person codingbear    schedule 06.06.2009

Как я решил это, и это действительно хак, я переименовал поле формы в пароль2, затем в своем методе контроллера я установил


$this->data['password] = $this->data['password2]

Потом я позвонил


$this->Auth->login($this->data)

и это, казалось, работало. Я не думаю, что это лучший способ, однако он сработал, и я буду использовать его, пока не найду лучшее решение.

person Shiv    schedule 11.06.2009
comment
Шифровали ли вы вручную $this-›data['password'] перед вызовом $this-›Auth-›login()? Если это так, проблема заключается в том, что метод входа в систему также выполняет шифрование пароля, поэтому он ожидает, что он будет предоставлен в виде открытого текста. - person Matt Huggins; 16.10.2009

В вашем app_controller.php

function beforeFilter() {
    $this->Auth->fields = array( 'username' => 'email', 'password' => 'password' );
    $this->Auth->loginAction = array('controller'=>'users','action'=>'login');
    $this->Auth->loginRedirect = array('controller'=>'users','action'=>'landing');
    $this->Auth->logoutRedirect = array('controller'=>'users','action'=>'home');
}

В вашем контроллере пользователей:

function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow(list of your allowed actions);
}
person Anh Pham    schedule 02.08.2011

Если вы используете CakePHP 1.2, вам необходимо изменить:

$this->Auth->allow('home','register','activate','forgot','reset','_sendEmail','reset');

to

$this->Auth->allow(array('home','register','activate','forgot','reset','_sendEmail','reset'));

Обратите внимание на добавленный «массив()» в функции разрешения.

person Jefe    schedule 06.06.2009