2015-06-15 3 views
2

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

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

  $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. Как я могу зашифровать пароль, исходящий из формы, и совместить с полем старого прохода в правиле?

ответ

12

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

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

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

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

+0

Отлично. Я действительно обсуждал то же самое с моим коллегой, и это именно то, что предложил мой старший. благодаря –

1

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

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

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

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

Спасибо

Edit: форматирование кода

Смежные вопросы