J'essaie d'écrire des règles de validation de formulaire dans mon contrôleur pour soumettre le formulaire de changement de mot de passe dans lequel je vérifie aussi l'ancien mot de passe. Je reçois l'ancien mot de passe (actuel) de la base de données et le place dans un champ de saisie masqué.
Mes règles sont simples et sont données ci-dessous
$config=array(
array(
'field' => 'old_password',
'label' => 'oldpass',
'rules' => 'trim|required'
),
array(
'field' => 'conf_password',
'label' => 'connewpass',
'rules' => 'trim|required|matches[password]'
),
array(
'field' => 'password',
'label' => 'newpass',
'rules' => 'trim|required'
)
Mon champ de saisie caché dans le formulaire pour enregistrer le mot de passe actuel est comme
<input type="hidden" name="old_pass" value="<?php echo $user['password']?>">
Je sais que les correspondances (nom de champ) dans les règles fonctionnent pour faire correspondre deux valeurs de champ, mais je suis bloqué parce que le mot de passe provenant de la base de données est crypté md5. Comment puis-je chiffrer le mot de passe provenant du formulaire et le faire correspondre à l'ancien champ de passe de la règle?
Il n'est pas nécessaire de mettre l'ancien mot de passe hash dans le champ caché. ce n'est même pas sûr. vous pouvez créer une fonction de rappel pour votre propre validation personnalisée. Notez le commentaire que j'ai fait dans le code suivant.
$config=array(
array(
'field' => 'old_password',
'label' => 'oldpass',
'rules' => 'trim|required|callback_oldpassword_check' // Note: Notice added callback verifier.
),
array(
'field' => 'conf_password',
'label' => 'connewpass',
'rules' => 'trim|required|matches[password]'
),
array(
'field' => 'password',
'label' => 'newpass',
'rules' => 'trim|required'
)
En parallèle, votre contrôleur crée une méthode comme ci-dessous
public function oldpassword_check($old_password){
$old_password_hash = md5($old_password);
$old_password_db_hash = $this->yourmodel->fetchPasswordHashFromDB();
if($old_password_hash != $old_password_db_hash)
{
$this->form_validation->set_message('oldpassword_check', 'Old password not match');
return FALSE;
}
return TRUE;
}
pour plus de détails sur la vérification de rappel, rendez-vous here
Je n'ai pas vérifié le code ci-dessus. Mais espérons que vous aurez le moyen de résoudre votre problème.
Une autre approche:
if (!$this - > checkValidLogin($username, $old_password)) {
$this - > form_validation - > set_rules('password', 'Password', [
[
'old_password',
function($value) {
return false;
}
]
]);
$this - > form_validation - > set_message('old_password', 'Old password doesn\'t match.');
}
Veuillez utiliser comme ceci, si vous utilisez la bibliothèque de validation de formulaire, cela fonctionne pour moi.
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('confirm_password', 'Confirm Password', 'required|matches[password]');
Je vous remercie
Edit: Formatage du code