Ошибка входа в CakePHP

У меня есть простое приложение cakephp, которое я создаю, используя этот учебник Простое приложение для аутентификации и авторизации. У меня точно такой же блок кода, как и в учебнике.

Я запускаю это на своем компьютере с помощью Apache/MySQL, все работает нормально. Когда я развертываю его на своем общем хостинге (Bluehost), я начинаю получать ошибки при входе в систему.

Я проверил базу данных MySQL на своем локальном компьютере и на сервере. Разница в том, что пароли в моей локальной БД хэшируются, а пароли на хостинговых БД простые. (Это точно такой же код.) (Я хочу прояснить этот вопрос, это не мое намерение и, очевидно, другое поведение, но я не знаю, в чем причина этого.)

Это моя таблица:

CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(50),
    role VARCHAR(20),
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

Это соответствующие методы моего контроллера для регистрации и входа в систему соответственно:

public function add() {
    if ($this->request->is('post')) {
        $this->User->create();
        if ($this->User->save($this->request->data)) {
            $this->Session->setFlash(__('The user has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
        }
    }
}

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            $this->redirect($this->Auth->redirect());
        } else {
            $this->Session->setFlash(__('Invalid username or password, try again'));
        }
    }
}

и, наконец, это метод beforeSave() моей модели:

public function beforeSave() {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
    }
    return true;
}

На моем локальном компьютере я могу сначала добавить пользователя, а затем войти в систему с этим пользователем. На сервере я могу добавить пользователя, но когда я хочу войти, я вижу сообщение об ошибке «Неверное имя пользователя или пароль, попробуйте еще раз»


person Szere Dyeri    schedule 14.06.2012    source источник
comment
Почему вы не храните хешированные пароли на сервере?   -  person gcochard    schedule 14.06.2012
comment
Это то, о чем я спрашиваю. Я намерен хранить их в хешированном виде. Почему-то они хранятся в обычном виде. Я не знаю, чем вызвана такая разница в поведении.   -  person Szere Dyeri    schedule 14.06.2012
comment
Похоже, вызов AuthComponent::password($this->data[$this->alias]['password']); не работает.   -  person gcochard    schedule 14.06.2012
comment
Вы установили Security.salt на Config/core.php?   -  person bfavaretto    schedule 14.06.2012
comment
@bfavaretto Я установил значение соли на какое-то случайное значение. Я использую один и тот же файл core.php в обоих местах.   -  person Szere Dyeri    schedule 14.06.2012
comment
@ Грег, если AuthComponent::password терпит неудачу, я не должен видеть сообщение об ошибке в добавлении?   -  person Szere Dyeri    schedule 14.06.2012
comment
если вы добавите debug($this->data) и debug($this->alias) в функцию beforeSave(), вы их увидите? И верны ли распечатанные значения? Кстати, ваш уровень отладки больше 0?   -  person nIcO    schedule 15.06.2012
comment
Я узнал проблему. Я забыл загрузить файл моей модели (User.php). Но каким-то образом он все еще создавал записи в БД. Очевидно, ему не хватало пользовательской логики для хеширования паролей.   -  person Szere Dyeri    schedule 16.06.2012


Ответы (1)


Похоже, вам нужно определить функцию beforeSave, чтобы принять параметр по умолчанию. Кажется, это проблема между cakephp и php 5.4.

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
    }
    return true;
}

Подробнее см. здесь:
http://community.webfaction.com/questions/8397/cakephp-2-auth-failing-on-production-only

person gcochard    schedule 14.06.2012
comment
Моя рабочая версия php — 5.2.17, но я попробую и спасибо за ссылку. - person Szere Dyeri; 14.06.2012