Я пытаюсь написать правила проверки формы в моем контроллере, чтобы отправить форму изменения пароля, в которой я также проверяю старый пароль. Я получаю старый пароль (текущий) из 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]');
Спасибо
Изменить: форматирование кода