CakePHP - Не удается получить доступ к паролю пользователя, вошедшего в систему, в модели с использованием Authcomponent::user

Я начал пробовать CakePHP несколько месяцев назад и сейчас пытаюсь создать «страницу смены пароля» для зарегистрированных пользователей. У меня есть форма, состоящая из этих полей: текущий пароль, новый пароль и подтверждение нового пароля. Для текущего пароля я хочу проверить, соответствует ли он паролю вошедшего в систему пользователя, как правило, в пользовательской модели. Я знаю, что могу получить информацию о вошедшем в систему пользователе с помощью этого: AuthComponent::user(). Однако он предоставляет мне все поля модели, кроме пароля.

Я знаю, что Auth->login() отвечает за настройку переменных сеанса для вошедшего в систему пользователя, но я не уверен, что я здесь делаю неправильно, что только поле пароля недоступно:

public function login() {

    if ($this->request->is('POST')) {
        if($this->Auth->login()) {
            $this->redirect($this->Auth->redirect());
        } else {
            $this->Session->setFlash('Your username/password combination was incorrect.');
        }
    }
}

Вот мой вид входа:

<h2>Login</h2>
<?php 
echo $this->Form->create('Promoter');
echo $this->Form->input('username');
echo $this->Form->input('password', array('type' => 'password'));
echo $this->Form->end('Login');?>

Я использую модель Promoter в качестве пользователя, который я установил в AppController:

public $components = array(
    'Auth'=>array(
        ...
        'authenticate' => array(
            'Form' => array('userModel' => 'Promoter')
        ),
        'authorize' => array('Controller')
    )
);

Я могу прибегнуть к проверке пароля в контроллере, но это было бы отказом :) Пожалуйста, сообщите мне, нужно ли мне предоставить дополнительный код, чтобы прояснить проблему.

Спасибо.


person timp    schedule 19.05.2012    source источник


Ответы (2)


Вы, вероятно, не делаете ничего плохого, это, скорее всего, функция безопасности. Нет причин хранить пароль в сеансе.

Во-вторых, даже если бы он был в сеансе, он был бы зашифрован (или, по крайней мере, я на это надеюсь, если это не так, вы должны немедленно изменить это!). Таким образом, вы все еще не могли сделать простое сравнение.

Чтобы сравнить старый пароль, вы должны запросить свою модель Promoter и получить оттуда хешированный пароль, затем хешировать старый пароль из формы «изменить пароль» и, наконец, сравнить хешированные результаты.

person dr Hannibal Lecter    schedule 20.05.2012

Потому что торт не хранит пароль в сеансе:

lib/Cake/Component/Auth/BaseAuthenticate.php строка 94

unset($user[$fields['password']]);
person tigrang    schedule 20.05.2012