2009-08-23 17 views
6

Saludos,CakePHP: Campo de contraseña de borrado en el envío fallido

Estoy configurando un formulario de registro bastante estándar con campo de contraseña.

El problema es que después de una presentación fallida (debido a campo vacío, formato incorrecto, etc.), el controlador vuelve a cargar la página de registro, pero con el campo de contraseña que contiene el valor hash de la contraseña previamente ingresada. ¿Cómo lo hago vacío después de cada envío fallido?

Vista:

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

controlador:

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

Ayuda es muy apreciada, gracias!

Respuesta

9

Puede ejecutar en otro problema por el camino con la validación de contraseña CakePHP.

El problema es que las contraseñas hash pastel primero, luego hace la validación, lo que puede hacer que la entrada falle incluso si es válida de acuerdo con sus reglas. Es por eso que la contraseña se devuelve al campo de entrada hash en lugar de normal.


de solucionar este problema, en lugar de utilizar el nombre del campo especial 'contraseña', utiliza un nombre diferente, como 'tmp_pass'. De esta forma, CakePHP Auth no automáticamente reducirá el campo.

Aquí está un ejemplo de formulario

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'); 

En su modelo de proveedor, no asigne reglas de validación a 'password' en lugar asignar estas normas a 'tmp_pass', por ejemplo

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

se convierte en

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

Finalmente, en su modelo de proveedor, implemente beforeSave().

Primero, compruebe si los datos validan ('tmp_pass' se validará según sus reglas).

Si tiene éxito, manualmente hash tmp_pass y póngalo en $ this-> data ['Vendor'] ['password'] y luego devuelva true. Si no tiene éxito, devuelve falso.

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 - esto fue muy útil para mí también, sin embargo, sugiero usar las funciones correctas 'Auth-> password()' o 'Auth-> hashPasswords()' que salarte y machacarte a ti mismo. – nickf

+0

Deberías ** no ** hash la contraseña tú mismo con 'sha1', ya que ** puede ** introducir inconsistencias con la forma' Auth' (si eso es lo que estás usando) hash la contraseña en el camino. Use '$ this-> Auth-> password()' en su lugar! – deceze

+1

@deceze, mirando la fuente, 'Auth :: hashPasswords()' llamará a la función 'User :: hashPassword()' si está definida, mientras que 'Auth :: password()' no lo hará. – nickf

8

esto?

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

Gracias, este funciona también. ¿Es esta la forma estándar de lograr lo que quiero? –

+0

Así es como se establece el valor de un campo de entrada para form helper –

3

En su controlador:

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

hmmm, esto me parece un poco raro, ya que tengo varios tipos de usuarios con distintas propiedades en el db y podría agregar más en el futuro.Pero por ahora funciona, supongo, gracias :) –

Cuestiones relacionadas