Почему компонент аутентификации CakePHP не хэширует мой пароль?
Я использую CakePHP 1.2 с компонентами Auth и ACL.
В моем действии регистрации пользователя пароль вводится не хэшированным. Конкретно это выражение:
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password']))
Это оценивается как истина, даже когда я отправляю идентичные значения для 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 ответа
CakePHP не будет хэшировать пароли, если имя пользователя не содержит переданного значения. Я заменяю поле имени пользователя электронной почтой. Однако я переназначил эти поля, установив массив Auth->fields. Тем не менее, я делал это в appController вместо userController. Итак, переместим эту строку:
$this->Auth->fields = array('username' => 'email', 'password' => 'password');
из appController в userController решил это.
Теперь возникает вопрос: "Почему я не могу сбросить поля Auth-> в appController?"
Вы, вероятно, переопределяете AppController::beforeFilter()
с вашим UsersController::beforeFilter()
,
Чтобы "починить" это, просто поставьте parent::beforeFilter()
в начале функции.
Вы должны хешировать пароль перед сохранением в базу данных. Поместите эту функцию в вашу модель User:
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');
}
Это означает, что пароль НЕ будет хешироваться во время процесса регистрации (в случае неудачной проверки формы регистрации).
Я думаю, что вы ищете
hashPasswords ($data)
посмотрите на эти страницы. Они должны указать вам правильное направление. Вы также можете попробовать изменить уровень отладки в файле конфигурации ядра. изменив его с 0 (производство) на 3, вы увидите вывод sql. может быть полезным
Извините, я ничего не могу сделать, кроме как направить вас в правильном направлении. Я новичок в CakePHP.