2013-08-09 4 views
0

Я использую codeigniter-bcrypt от https://github.com/dwightwatson/codeigniter-bcrypt, с codeigniter. У меня есть форма, которая отправляет данные на мой главный контроллер. Затем я проверяю через модель БД для записи. Я использовалCodeigniter login с codeigniter-bcrypt

$hash = $this->bcrypt->hash_password($password); 

Хеш-пароль для создания счета. И это работает. Пароль правильно хэшируется в БД. Теперь, однако, я не уверен, где использовать обратный, чтобы проверить, введен ли пароль, введенный в форму для публикации, так же, как и хэшированный пароль БД.

if ($this->bcrypt->check_password($password, $stored_hash)) 
{ 
    // Password does match stored password. 
} 
else 
{ 
    // Password does not match stored password. 
} 

Мой код в моей модели

function getUserByLogin($login, $password) {   
    $this->db->where('login',$login); 
    $this->db->where('password',$password); 

    $result = $this->getUsers(); 

    if (count($result) > 0) { 
     return $result[0]; 
    } else { 
     return null; 
    } 
} 
function getUsers() { 
    $query = $this->db->get('users'); 

    if ($query->num_rows() > 0) { 
     return $query->result(); 
    } else { 
     return array(); 
    } 
} 

и мой контроллер

if (isset($_POST['email']) && isset($_POST['password'])) { 
      $login = $_POST['email']; 
      $password = $_POST['password']; 
      $user = $this -> user_model -> getUserByLogin($login, $password); 
      $this -> saveUserToSession($user); 
      $loggedIn = ($user == null ? false : true); 
     } 

Любая помощь будет оценена.

+0

проверка пароля является правильной, как по документации. с какими проблемами вы столкнулись? – tomexsans

+0

где выполнить проверку. Я попытался использовать его на контроллере с данными post, которые, похоже, не работали, я тогда попытался проверить сразу после запроса БД, но переменные являются объектами в этой точке. – user1881482

+0

выполните проверку на 'model', которая возвращает' true' или 'false'. Очевидно, что текущий запрос не проверяет имя пользователя и пароль. Включите имя пользователя и пароль в свой запрос. так что вы получите только пользователя, у которого есть как имя пользователя, так и пароль. Не все – tomexsans

ответ

4

Это не будет делать:

$this->db->where('password',$password); 

Вы проверки фактического сырым пароля внутри БД.

Вы должны получить хэш из базы данных, а затем сравнить его с помощью пароля пользователя:

function getUserByLogin($login, $password) {   
    $this->db->where('login',$login); 

    $result = $this->getUsers($password); 

    if (!empty($result)) { 
     return $result; 
    } else { 
     return null; 
    } 
} 
function getUsers($password) { 
    $query = $this->db->get('users'); 

    if ($query->num_rows() > 0) { 

     $result = $query->row_array(); 

     if ($this->bcrypt->check_password($password, $result['password'])) { 
      //We're good 
      return $result; 
     } else { 
      //Wrong password 
      return array(); 
     } 

    } else { 
     return array(); 
    } 
} 
+0

Это похоже на то, что я изначально пытался. Я скопировал его в свой код, и он, похоже, не работал. – user1881482

+0

Маленькая проблема, необходимая для использования $ result ['Password'], чтобы заставить индекс работать. Однако check_password не работает. Я повторил $ ​​password и $ result ['Password'] до того, как if и оба имеют правильные значения, однако $ this-> bcrypt-> check_password, похоже, не корректно проверяет значения, всегда возвращается неправильно – user1881482

+0

Спасибо за помощь здесь , Это сработало. Найденная проблема, я сохранял свою переменную пароля в поле varchar (64). Изменил его на varchar (128) и фактически разрешил хранить полный зашифрованный пароль. – user1881482

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