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;
¿Ayudaría esto: http://sumanrs.wordpress.com/2011/10/01/cakephp-user-password-manager-authentication-missing-guide/ ? Eso debería encargarse de la validación de contraseñas.
Para los usuarios de CakePHP 2.x que utilizan Autenticación, puede observar que "AuthComponent ya no almacena automáticamente todas las contraseñas que puede encontrar". Es decir, las soluciones anteriores pueden no ser la forma correcta de resolver el problema para 2.x. http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#hashing-passwords
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;
}
}
}