Как заставить Аутентификацию работать снова в CakePHP 2.0? - PullRequest
0 голосов
/ 29 октября 2011

После миграции полнофункционального приложения 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 не выводил никаких сообщений об ошибках.

UPDATE 3 Становится страннее.Я думал, что решил это, но после переноса моего кода на другую машину разработки Auth внезапно перестает работать.Он работает на моей основной установке, но при тестировании на другой он снова не проходит по тому же сценарию.Я очистил кеш, чтобы быть уверенным, но он все еще не работает.Cake не генерирует никаких сообщений об ошибках.

UPDATE 4 Кажется, это проблема сеанса на моей машине.Я только что установил Session для сохранения в cookie, и вдруг Auth снова начинает работать.Не знаю, почему сеанс по умолчанию не работает, и я не знаю, с чего начать отладку в этом случае.

Похоже, что работают только сеансы cookie, определение сеанса базы данных имеет тот же результат, что и обычный сеанс;Аут перестает работать.

Ответы [ 2 ]

1 голос
/ 03 января 2012

Попробуйте, используя use_trans_sid в /Config/core.php:

Configure::write('Session', array(
    //'defaults' => 'php'
    'defaults' => 'cake',
    'cookie' => 'CAKEPHP2',
    'ini' => array('session.use_trans_sid' => true)
));
0 голосов
/ 31 октября 2011

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

public $components = array(
    'Auth'=> array(
        'authenticate' => array('Form')
    )
);
...