После переноса полнофункционального приложения Cake 1.3 на недавно вышедшую версию 2.0 перестала работать аутентификация.
Я изменил вызов действия AuthComponent
и структуру действия login
в соответствии с обновленным руководством 2.0, но безрезультатно. Странно то, что пользователь фактически проверяется $this->Auth->login()
, поскольку он достигает той части функции входа в систему, где пользователь перенаправляется на URL-адрес, установленный $this->Auth->redirect()
. Однако после этого перенаправления $this->Auth->user()
возвращает пустое значение (как и AuthComponent::user()
), и пользователь не входит в систему с помощью компонента Auth.
Cake не выдает никаких ошибок во время процесса, флэш-сообщения для «auth» остаются пустыми.
Пользователи хранятся в простой таблице базы данных, содержащей столбцы идентификатора, имени пользователя, электронной почты, пароля и отметки времени. Пароли хешированы, и я добавил несколько пользователей, используя новые методы Cake 2.0.
Это код AppController.php:
<?php
class AppController extends Controller {
public $helpers = array('Session', 'Html', 'Time', 'Form', 'Text');
public $components = array('Session', 'RequestHandler', 'Auth');
public function beforeFilter() {
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->loginRedirect = array('controller' => 'maps', 'action' => 'index');
$this->Auth->logoutRedirect = array('controller' => 'maps', 'action' => 'index');
}
}
?>
UserController.php:
<?php
class UsersController extends AppController {
public $name = 'Users';
function beforeFilter() {
parent::beforeFilter();
}
function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
}
}
}
function logout() {
$this->redirect($this->Auth->logout());
}
}
?>
Модель User.php. Я отключил проверку формы на данный момент после решения этой проблемы:
<?php
class User extends AppModel {
public $name = 'User';
}
?>
Вид входа:
<?php
echo $this->Form->create('User');
echo $this->Form->input('username', array('label' => 'Username', 'before' => '<p class="input" id="username">', 'after' => '</p>', 'between' => '<br />', 'div' => false));
echo $this->Form->input('password', array('label' => 'Password', 'before' => '<p class="input" id="password">', 'after' => '</p>', 'between' => '<br />', 'div' => false));
echo $this->Form->end('Login');
?>
Я также попытался установить некоторые функции аутентификации в переменной $components
в AppController
, но это тоже не сработало:
public $components = array(
'Auth'=> array(
'loginAction' => array(
'controller' => 'users',
'action' => 'login',
),
'loginRedirect' => array(
'controller' => 'maps',
'action' => 'index',
),
'authenticate' => array(
'Form' => array(
'fields' => array('username', 'password')
)
)
)
);
Что вызывает проблему здесь? Может маршрутизация? Я закомментировал все маршруты, кроме:
require CAKE . 'Config' . DS . 'routes.php';
ОБНОВЛЕНИЕ: после добавления некоторых операторов отладки в метод входа в UsersController я теперь знаю, что $this->Auth->user()
фактически заполняется правильным пользователем после вызова $this->Auth->login()
. Однако после перенаправления на другой контроллер сеанс входа в систему полностью теряется. Так что я до сих пор не знаю, что здесь происходит.
ОБНОВЛЕНИЕ 2 Я перезапустил процесс переноса, взяв свое работающее приложение версии 1.3 и запустив на нем сценарий консоли переноса, как в прошлый раз.
На этот раз я заметил, что скрипт остановился из-за двух ошибок, связанных с пользовательскими компонентами. Классы компонентов теперь должны расширять класс Component вместо стандартного в 1.3: Object.
После исправления этих ошибок компонента я снова запустил сценарий миграции (то, что я забыл сделать во время первой попытки миграции) и реализовал новый вызов AuthCompenent. Пока вроде все работает правильно. Не знаю, что изменилось сейчас и что пошло не так в первый раз, поскольку Cake не выдавал никаких сообщений об ошибках.
ОБНОВЛЕНИЕ 3. Становится все более странно. Я думал, что решил это, но после переноса моего кода на другую машину разработки Auth внезапно перестает работать. Он работает на моей основной установке, но при тестировании на другом снова выходит из строя по тому же сценарию. Я очистил кеш, чтобы быть уверенным, но он все еще не работает. Cake не выдает ошибок.
ОБНОВЛЕНИЕ 4 Похоже, проблема с сеансом на моей машине. Я только что установил сеанс для хранения в файле cookie, и вдруг Auth снова начинает работать. Не уверен, почему сеанс по умолчанию не работает, и я не знаю, с чего начать отладку в этом случае.
Кажется, что работают только сеансы cookie, определение сеанса базы данных дает тот же результат, что и обычный сеанс; Авторизация перестает работать.