Почему компонент аутентификации CakePHP не хэширует мой пароль? - PullRequest
1 голос
/ 06 марта 2009

Я использую CakePHP 1.2 с компонентами Auth и ACL.

В моем действии регистрации пользователя пароль вводится не хэшированным. Конкретно это выражение:

if ($this->data['User']['password'] !=
    $this->Auth->password($this->data['User']['confirm_password']))

Это значение true, даже когда я отправляю идентичные значения для password и confirm_password. Я знаю, что пароль не хэшируется, потому что когда я удаляю вызов Auth->password, выражение оценивается как ложное.

Я ожидал, что модуль Auth автоматически хеширует пароль. Что я делаю не так?

Вот мой взгляд:

<?php
    echo $form->create('User', array('action' => 'register'));

    echo $form->input('email',
                      array('after' => $form->error(
                        'email_unique', 'This email is already registered.')));
    echo $form->input('password');
    echo $form->input('confirm_password', array('type' => 'password'));
    echo $form->end('Register');
?>

Вот мое действие по регистрации от пользовательского контроллера:

function register(){
    if ($this->data) {
        if ($this->data['User']['password'] !=
            $this->Auth->password($this->data['User']['confirm_password'])) {

            $this->Session->setFlash(__('Password and Confirm Password must match.', true));
            $this->data['User']['password'] = '';
            $this->data['User']['confirm_password'] = '';
        }
        else{
            $this->User->create();
            if ($this->User->save($this->data)){
                $this->redirect(array('action' => 'index'), null, true);
            }
            else {
                $this->data['User']['password'] = '';
                $this->data['User']['confirm_password'] = '';
                $this->Session->setFlash(__('Some problem saving your information.', true));
            }
        }
    }
}

А вот мой appController, куда я включаю модули Auth и Acl:

class AppController extends Controller {
    var $components = array('Acl', 'Auth');

    function beforeFilter(){
        if (isset($this->Auth)) {
            $this->Auth->allow('display');
            $this->Auth->fields =
              array(
                'username' => 'email',
                'password' => 'password');
            $this->Auth->authorize = 'actions';
        }
    }
}

Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 23 марта 2009

Вы, вероятно, переопределяете AppController::beforeFilter() со своим UsersController::beforeFilter().

Чтобы "исправить" это, просто поставьте parent::beforeFilter() в начале функции.

2 голосов
/ 07 марта 2009

CakePHP не будет хэшировать пароли, если имя пользователя не содержит переданного значения. Я заменяю поле имени пользователя электронной почтой. Однако я переназначил эти поля, установив массив Auth-> fields. Тем не менее, я делал это в appController вместо userController. Итак, переместим эту строку:

$this->Auth->fields = array('username' => 'email', 'password' => 'password');

из appController в userController решил это.
Теперь возникает вопрос: «Почему я не могу сбросить поля Auth-> в appController?»

1 голос
/ 06 марта 2009

Вы должны хешировать пароль перед сохранением в базу данных. Поместите эту функцию в вашу модель пользователя:

function beforeSave() {
  if(isset($this->data[$this->alias]['password']))
    $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
  return true;
}

И не забудьте поместить это в beforeFilter() на свой контроллер пользователя:

if(in_array($this->action, array('register'))) {
  $this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}

Это означает, что пароль НЕ будет хешироваться во время процесса регистрации (в случае неудачной проверки формы регистра).

0 голосов
/ 06 марта 2009

Я думаю, что вы ищете

hashPasswords ($data)

посмотрите на эти страницы. Они должны указать вам правильное направление. Вы также можете попробовать изменить уровень отладки в файле конфигурации ядра. изменив его с 0 (производство) на 3, вы увидите вывод sql. может быть полезным.

AuthComponent Методы

Устранение неполадок Cakephp

Извините, я ничего не могу сделать, кроме как направить вас в правильном направлении. Я новичок в CakePHP.

...