2009-08-23 3 views
6

Приветствия,CakePHP: очистка поля пароля при неудачном представлении

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

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

Вид:

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

Контроллер:

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

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

ответ

9

Вы можете столкнуться с другой проблемой вниз по дороге с проверкой пароля 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'); 

В модели поставщика, не следует назначать правила проверки на «пароль», а не назначать эти правила к «tmp_pass», например

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

будет

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

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

Прежде всего, проверьте, проверены ли данные («tmp_pass» будет проверен на соответствие вашим правилам).

В случае успеха вручную hash 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; 
} 
+1

+1 - это тоже очень полезно для меня, однако я бы предложил использовать правильные 'Auth-> password()' или 'Auth-> hashPasswords()' функции, а чем солить и хешировать себя. – nickf

+0

Вы должны ** не ** хешировать пароль самостоятельно с помощью 'sha1', так как это ** может ** ввести несогласованности с методом' Auth' (если это то, что вы используете) хэширует пароль по дороге. Вместо этого используйте '$ this-> Auth-> password()'! – deceze

+1

@deceze, глядя на источник, 'Auth :: hashPasswords()' будет вызывать функцию 'User :: hashPassword()', если она определена, тогда как 'Auth :: password()' does not. – nickf

8

это?

password('Vendor.password', array('class' => 'text-input','value'=>'')) 
+0

Спасибо, этот работает тоже. Является ли это стандартным способом достижения того, чего я хочу? –

+0

Вот как вы устанавливаете значение поля ввода для хедера формы –

3

В контроллере:

function beforeRender() { 
    parent::beforeRender(); 
    $this->data['Vendor']['password'] = ''; 
} 
+0

hmmm, это кажется немного взломанным для меня, так как у меня есть несколько типов пользователей с отличными свойствами в db и может добавить больше в будущем.Но пока это работает, я думаю, спасибо :) –

Смежные вопросы