2010-09-21 14 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']); 
} 

Questo codice non funziona e restituisce sempre il messaggio di errore anche se corrispondono. Inoltre quando faccio una modifica ottengo l'errore di followo poiché non ci è campo della parola d'accesso. C'è qualche correzionevalidazione password cakephp

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

è '$ this-> datadata' previsto? Se no, c'è il tuo problema. – Stephen

+0

Ho corretto il codice sopra riportato per rimuovere i dati extra ancora ottengo l'errore – aWebDeveloper

+0

Posso vedere il modulo html che pubblica i dati? – Stephen

risposta

5

qui è l'errore

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

ho cambiato in

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

anche la funzione strcmp avuto anche errori come sarebbe ritorno 0 (vale a dire false) per tutto il tempo nel codice sopra

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

Oh, l'orribile ridondanza! In un caso come questo dovresti usare 'return strcmp (...) == 0'. – deceze

12

Stai utilizzando AuthComponent? Si noti che blocca tutti i campi password in entrata (ma non i campi "conferma password", verificare con debug($this->data)), in modo che i campi non siano mai gli stessi. Read the manual and use AuthComponent::password per fare il controllo.


Detto questo, ecco qualcosa che uso:

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'."); 
    } 
} 

Questo è un male per i seguenti motivi:

  • Ha accoppiamento stretto alla forma, si aspetta sempre un campo password_control a essere presenti. Devi utilizzare la whitelist del campo o disabilitare la convalida se non ne hai uno nei tuoi dati, ad esempio $this->User->save($this->data, true, array('field1', 'field2')).
  • Manca la password manualmente come fa AuthComponent (poiché non vi è un accesso pulito ai componenti dal modello). Se si modifica l'algoritmo utilizzato in AuthComponent, è necessario modificarlo anche qui.

Detto questo, convalida in modo trasparente e genera messaggi di errore corretti per entrambi i campi di controllo password e password senza richiedere alcun codice aggiuntivo nel controller.

1

Heres è la mia soluzione:

È necessario per fare una partita metodo denominato (È possibile assegnare un nome come volete):

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; 
} 

E il metodo $ validate deve essere simile a questo:

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

Dove password2 è il campo di confrontare il vostro primo campo password

Sono felice di condividerlo!: D

3

Per Convalida password, vecchia password e confermare la password

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

Questa soluzione mi ha aiutato ed è chiaro – daniherculano