CakePHP: очистка поля пароля при неудачной отправке - PullRequest
6 голосов
/ 23 августа 2009

Привет,

Я настраиваю довольно стандартную регистрационную форму с полем пароля.

Проблема в том, что после неудачной отправки (из-за пустого поля, неправильного формата и т. Д.) Контроллер перезагружает страницу регистрации, но с полем пароля, содержащим хэшированное значение ранее введенного пароля. Как сделать его пустым после каждой неудачной отправки?

Вид:

echo $form->password('Vendor.password', array('class' => 'text-input'));

Контроллер:

Security::setHash('sha1');
$this->Auth->sessionKey = 'Member'; 
$this->Auth->fields = array(
    'username' => 'email',
    'password' => 'password'
);

Помощь очень ценится, спасибо!

Ответы [ 3 ]

9 голосов
/ 24 августа 2009

Вы можете столкнуться с другой проблемой в будущем при проверке пароля в cakePHP.

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


чтобы исправить это, вместо использования специального имени поля «пароль», используйте другое имя, например «tmp_pass». Таким образом, cakePHP Auth не будет автоматически хешировать поле.

Вот пример формы

echo $form->create('Vendor', array('action' => 'register'));
echo $form->input('email');
echo $form->input( 'tmp_pass', array( 'label' => 'Password','type'=>'password' ));
echo $form->end('Register');

В вашей модели Vendor не назначайте правила проверки для «пароля», а назначайте эти правила для «tmp_pass», например

var $validate = array('email' => 'email', 'password' => ... password rules... );

становится

var $validate = array('email' => 'email', 'tmp_pass' => ... password rules... );

Наконец, в вашей модели Vendor реализуйте beforeSave ().

Сначала посмотрите, проверяются ли данные (tmp_pass будет проверен по вашим правилам).

В случае успеха вручную хэшируйте tmp_pass и помещайте его в $ this-> data ['Vendor'] ['password'], а затем возвращайте true. В случае неудачи верните false.

function beforeSave() {
    if($this->validates()){
        $this->data['Vendor']['password'] = sha1(Configure::read('Security.salt') . $this->data['User']['tmp_pass']);
        return true;
    }
    else
        return false;
}
8 голосов
/ 23 августа 2009

это

password('Vendor.password', array('class' => 'text-input','value'=>'')) 
3 голосов
/ 23 августа 2009

В вашем контроллере:

function beforeRender() {
    parent::beforeRender();
    $this->data['Vendor']['password'] = '';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...