users loadcomponent isauthorized example create component beforefilter auth php cakephp passwords

loadcomponent - la validación de contraseña cakephp



cakephp users (6)

¿Estás usando AuthComponent? Tenga en cuenta que contiene todos los campos de contraseña entrante (pero no los campos de "contraseña confirmada", compruebe con debug($this->data) ), por lo que los campos nunca serán los mismos. Lea el manual y use AuthComponent::password para hacer la verificación.

Habiendo dicho eso, aquí hay algo que 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''."); } }

Esto es malo por las siguientes razones:

  • Tiene un acoplamiento estrecho con el formulario, siempre espera que esté presente un campo password_control . Necesita usar la lista blanca de campo o deshabilitar la validación si no tiene una en sus datos, es decir: $this->User->save($this->data, true, array(''field1'', ''field2'')) .
  • Manualmente actualiza 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.

Una vez 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.

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 muestra 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ón

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


aquí está 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 devolvería 0 (es decir, False) todo el tiempo en el código anterior

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




Heres es mi solución:

Debe hacer un método llamado match (puede asignarle el nombre que desee):

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 $ validate debe ser así:

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

Donde password2 es el campo para comparar su primer campo de password

¡Me alegra compartirlo! :RE


Para validar contraseña, 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; } } }