2010-09-21 10 views
7
var $validate = array(
    'password' => array(
     'passwordlength' => array('rule' => array('between', 8, 50),'message' => 'Enter 8-50 chars'), 
     'passwordequal' => array('checkpasswords','message' => 'Passwords dont match') 
) 
); 

function checkpasswords() 
{ 
    return strcmp($this->data['Airline']['password'],$this->data['Airline']['confirm password']); 
} 

Este código no funciona y siempre da el mensaje de error, incluso si coinciden. También cuando hago una edición me sale el siguiente error ya que no hay campo de contraseña. ¿Hay alguna solucióncakephp contraseña de validación

Undefined index: password [APP/models/airline.php, line 25] 
+1

es '$ this-> datadata' previsto? Si no, ahí está tu problema. – Stephen

+0

he reparado el código anterior para eliminar los datos adicionales, aún recibo el error – aWebDeveloper

+0

¿Pude ver el formulario html que publica los datos? – Stephen

Respuesta

5

aquí es el error

'passwordequal' => array('checkpasswords','message' => 'Passwords dont match') 

lo cambié a

'passwordequal' => array('rule' =>'checkpasswords','message' => 'Passwords dont match') 

también la función strcmp también tenía errores, ya que sería devolver 0 (es decir, falsa) todo el tiempo en el código anterior

if(strcmp($this->data['Airline']['password'],$this->data['Airline']['confirm_password']) ==0) 
{ 
    return true; 
} 
return false; 
+5

¡Oh, la horrible redundancia! En un caso como este se supone que debes usar 'return strcmp (...) == 0'. – deceze

12

¿Está utilizando AuthComponent? Tenga en cuenta que contiene todos los campos de contraseña entrante (pero no los campos de "contraseña confirmada", consulte con debug($this->data)), por lo que los campos nunca serán los mismos. Read the manual and use AuthComponent::password para hacer el control.


Dicho esto, aquí hay algo que utilizo:

public $validate = array(
    'password' => array(
     'confirm' => array(
      'rule' => array('password', 'password_control', 'confirm'), 
      'message' => 'Repeat password', 
      'last' => true 
     ), 
     'length' => array(
      'rule' => array('password', 'password_control', 'length'), 
      'message' => 'At least 6 characters' 
     ) 
    ), 
    'password_control' => array(
     'notempty' => array(
      'rule' => array('notEmpty'), 
      'allowEmpty' => false, 
      'message' => 'Repeat password' 
     ) 
    ) 
); 

public function password($data, $controlField, $test) { 
    if (!isset($this->data[$this->alias][$controlField])) { 
     trigger_error('Password control field not set.'); 
     return false; 
    } 

    $field = key($data); 
    $password = current($data); 
    $controlPassword = $this->data[$this->alias][$controlField]; 

    switch ($test) { 
     case 'confirm' : 
      if ($password !== Security::hash($controlPassword, null, true)) { 
       $this->invalidate($controlField, 'Repeat password'); 
       return false; 
      } 
      return true; 

     case 'length' : 
      return strlen($controlPassword) >= 6; 

     default : 
      trigger_error("Unknown password test '$test'."); 
    } 
} 

Esto es malo para las siguientes razones:

  • Ha acoplamiento ajustado a la forma, siempre espera un campo password_control a estar. Debe utilizar la lista blanca de campos o deshabilitar la validación si no tiene una en sus datos, es decir: $this->User->save($this->data, true, array('field1', 'field2')).
  • Manualmente hash la contraseña de la forma en que lo hace AuthComponent (ya que no hay acceso limpio a los componentes del modelo). Si cambias el algoritmo utilizado en AuthComponent, debes cambiarlo aquí también.

Habiendo dicho esto, valida de forma transparente y produce mensajes de error adecuados para los campos de contraseña y control de contraseña sin requerir ningún código adicional en el controlador.

1

Heres es mi solución:

Usted debe hacer un método llamado partido (puede que el nombre lo que te gusta):

public function match($check, $with) { 
    // Getting the keys of the parent field 
    foreach ($check as $k => $v) { 
     $$k = $v; 
    } 

    // Removing blank fields 
    $check = trim($$k); 
    $with = trim($this->data[$this->name][$with]); 

    // If both arent empty we compare and return true or false 
    if (!empty($check) && !empty($with)) { 
     return $check == $with; 
    } 

    // Return false, some fields is empty 
    return false; 
} 

Y el método $ validación debe ser como este:

public $validate = array(
    'password' => array(
     'match' => array(
      'rule' => array('match', 'password2'), 
      'message' => 'Passwords doesnt match', 
     ), 
    ), 
); 

Dónde password2 es el campo para comparar su primera password campo

¡Me alegra compartirlo!: D

3

Para Validar contraseña, la contraseña anterior y confirmar contraseña

class Adminpassword extends AppModel 
{ 


    public $name   = 'Admin'; 
      public $primaryKey = 'id'; 
      public $validate = array(
       'oldpassword' => array(
         array(
         'rule' => 'notEmpty', 
         'required' => true, 
         'message' => 'Please Enter Current password' 
         ), 
         array(
         'rule' =>'checkcurrentpasswords', 
         'message' => 'Current Password does not match' 
         ) 
       ), 
       'password' => array(
         array(
           'rule' => 'notEmpty', 
           'required' => true, 
           'message' => 'Please Enter password' 
         ), 
         array(        
         'rule' => array('minLength', 6), 
         'message' => 'Passwords must be at least 6 characters long.', 
         ) 
       ), 
       'cpassword' => array(
         array(
         'rule' => 'notEmpty', 
         'required' => true, 
         'message' => 'Please Enter Confirm password' 
         ), 
         array(
           'rule' => 'checkpasswords', 
           'required' => true, 
           'message' => 'Password & Confirm Password must be match.' 
         ) 
       ) 
      ); 

    function checkpasswords()  // to check pasword and confirm password 
    { 
     if(strcmp($this->data['Adminpassword']['password'],$this->data['Adminpassword']['cpassword']) == 0) 
     { 
      return true; 
     } 
     return false; 
    } 
    function checkcurrentpasswords() // to check current password 
    { 
     $this->id = $this->data['Adminpassword']['id']; 
     $user_data = $this->field('password');  
     //print_r(Security::hash($this->data['Adminpassword']['oldpassword'], 'sha1', true)); 
     if ($user_data == (Security::hash($this->data['Adminpassword']['oldpassword'], 'sha1', true))) 
     { 
      return true; 
     } 
     else 
     { 
     return false; 
     } 
    } 

} 
+0

Esta solución me ayudó y está claro – daniherculano

Cuestiones relacionadas