Как снова заставить аутентификацию работать в CakePHP 2.0?

После переноса полнофункционального приложения 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, определение сеанса базы данных дает тот же результат, что и обычный сеанс; Авторизация перестает работать.


person mensch    schedule 28.10.2011    source источник


Ответы (2)


Попробуйте с включенным use_trans_sid в /Config/core.php:

Configure::write('Session', array(
    //'defaults' => 'php'
    'defaults' => 'cake',
    'cookie' => 'CAKEPHP2',
    'ini' => array('session.use_trans_sid' => true)
));
person 3wv    schedule 03.01.2012
comment
Разве use_trans_sid не считается небезопасным? - person mensch; 03.01.2012
comment
На самом деле, я не знаю - я пытался протестировать плагин для пользователей cakeDC (ветка 2.0), и это не сработало. Поэтому я попытался выяснить, что сработает. - person 3wv; 06.01.2012
comment
Теперь у меня это работает без 'session.use_trans_sid' => true ... но я понятия не имею, почему, так как я многое изменил и изменил его обратно и т. д. - person 3wv; 06.01.2012
comment
Спасибо за продолжение. Если это небезопасно, я не буду его использовать, к сожалению. Компонент Auth все еще доставляет мне много хлопот, но когда он действительно работает, это относительно безболезненно. - person mensch; 06.01.2012

Вы также пытались настроить обработчик аутентификации?

public $components = array(
    'Auth'=> array(
        'authenticate' => array('Form')
    )
);
person Dan737    schedule 31.10.2011
comment
Да, я сделал это в одном из своих тестов в общедоступной переменной $components. - person mensch; 31.10.2011
comment
Как насчет вашей конфигурации сеанса? book.cakephp.org/2.0/en/development/sessions.html - person Dan737; 31.10.2011
comment
Сессия уже настроена в Core.php, но напрямую написать новый ключ конфигурации тоже не получилось, к сожалению. - person mensch; 31.10.2011
comment
Я думаю, вы были на правильном пути. Я только что установил, что моя сессия будет храниться в файле cookie, и Auth внезапно работает. Интересно, смогу ли я отладить настройки сеанса по умолчанию, потому что на одной из моих машин явно что-то идет не так. - person mensch; 02.11.2011