Правило проверки формы Codeigniter для соответствия (пароль)

Я пытаюсь написать правила проверки формы в моем контроллере, чтобы отправить форму изменения пароля, в которой я также проверяю старый пароль. Я получаю старый пароль (текущий) из db и помещаю его в скрытое поле ввода.

Мои правила просты и приведены ниже

$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' ) 

Мое скрытое поле ввода в форме для сохранения текущего пароля похоже на

 <input type="hidden" name="old_pass" value="<?php echo $user['password']?>"> 

Я знаю, что совпадения (имя поля) в правилах работают для сопоставления двух значений поля, но где я застрял в том, что пароль, исходящий из db, зашифрован в md5. Как я могу зашифровать пароль, исходящий из формы, и совместить с полем старого прохода в правиле?

Нет необходимости ставить старый хэш пароля в скрытом поле. это даже не безопасно. вы можете создать функцию обратного вызова для собственной пользовательской проверки. Обратите внимание на комментарий, который я сделал в следующем коде.

 $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' ) 

Со стороны вашего контроллера создайте метод, как показано ниже.

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

для более подробной информации о проверке обратного вызова

Я не проверял код выше. Но надеюсь, что у вас есть способ решить вашу проблему.

Другой подход:

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

Пожалуйста, используйте это, если вы используете библиотеку проверки формы, она работает для меня.

 $this->form_validation->set_rules('password', 'Password', 'required'); $this->form_validation->set_rules('confirm_password', 'Confirm Password', 'required|matches[password]'); 

Спасибо

Изменить: форматирование кода