2016-06-03 3 views
1

У меня проблема, если проверить пароль пользователя из моей базы данных mySQL. Сначала я хэш свой пароль и записать его в моей БД:Как проверить пароль пользователя из mysql DB

Первый мой регистр Handler:

class RegisterHandler 
{ 
    /** 
    * @var RegisterQuery 
    * 
    */ 
    private $register; 

    /** 
    * @var HashPassword 
    * 
    */ 
    private $HashPassword; 

    /** 
    * @var string 
    * 
    */ 
    private $getUsername; 

    /** 
    * @var string 
    * 
    */ 
    private $username; 

    public function __construct() 
    { 
     $this->username = $_POST['username']; 
     $this->register = new RegisterQuery; 
     $this->checkUsername = new SelectUsernameQuery; 
     $this->HashPassword = new HashPassword($_POST['password']); 
    } 

    public function execute() 
    { 
     $hashedPassword = $this->HashPassword->getHashedPassword(); 
     $salt = $this->HashPassword->getSalt(); 

     $dbUser = $this->checkUsername->execute($this->username); 
     $dbUser->bindValue(1, $this->username); 
     $dbUser->execute(); 

     if(!$dbUser->rowCount() == 0) { # If rows are found for query 
      echo "Username found"; 
      return; 
     } 

     $this->register->execute($this->username, $hashedPassword, $salt, $_POST['name']); 

    } 
} 

Вы можете увидеть, я хэш свой пароль в функции выполнения с этим кодом: (забыли соль я не используйте его больше)

class HashPassword 
{ 
    /** 
    * @var string 
    * 
    */ 
    private $salt = 'x'; 

    /** 
    * @var string 
    * 
    */ 
    private $hashedPassword; 

    public function __construct($password) 
    { 
     $this->hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]); 
     $this->getHashedPassword(); 
    } 

    public function getHashedPassword() 
    { 
     return $this->hashedPassword; 
    } 
} 

после хэширования пароля я пишу хэш в БД.

И вот мой вопрос: Как я могу получить пароль от БД, чтобы проверить его?

я пробовал:

class LoginHandler 
{ 

    private $databaseWrapper; 

    /** 
    * @var SelectUsernameQuery 
    * 
    */ 
    private $checkUsername; 

    private $checkPassword; 

    /** 
    * @var string 
    * 
    */ 
    private $enteredUsername; 

    /** 
    * @var string 
    * 
    */ 
    private $enteredPassword; 

    /** 
    * @var HashPassword 
    * 
    */ 
    private $passwordHasher; 

    public function __construct() 
    { 
     $this->databaseWrapper = new DatabaseWrapper; 
     $this->checkUsername = new SelectUsernameQuery; 
     $this->checkPassword = new SelectPasswordQuery; 
     $this->enteredUsername = $_POST['username']; 

     $this->passwordHasher = new HashPassword($this->enteredPassword); 
    } 

    private function createSessionName() 
    { 
     $_SESSION['name'] = $this->enteredUsername; 
    } 

    public function execute() 
    { 
     $this->verifyUser(); 
    } 

    private function verifyUser() 
    { 
     $this->enteredPassword = $_POST['password']; 
     $userDBHash = $this->checkPassword->execute($this->enteredUsername); 
     $userDBHash->execute(); 
     if(password_verify($this->enteredPassword, $userDBHash)) 
     { 
      echo 'password is valid'; 
     } 

     $dbUsername = $this->checkUsername->execute($this->enteredUsername); 
     $dbUsername->bindValue(1, $this->enteredUsername); 
     $dbUsername->execute(); 

     if(!$dbUsername->rowCount() == 0) { # If rows are found for query 
      echo 'Username: '."$this->enteredUsername".' was found!'; 
      $this->createSessionName(); 
      return; 
     } 

     echo 'Ups, This Username: '."$this->enteredUsername".' was not found!'; } 
    } 
} 

В классе verifyUser я пишу enteredpassword в переменной После этого я получить хэш из БД в $ userDBHash с этим запросом:

private function getUsername($username) 
{ 
    return $this->databaseWrapper->getPDO()->prepare(
      "SELECT password FROM users WHERE username = '$username'"); 
} 

После что я стараюсь password_verify($this->enteredPassword, $userDBHash) , но я получаю следующее сообщение об ошибке:

Warning: password_verify() expects parameter 2 to be string, object given in /var/www/c2b/src/Handlers/LoginHandler.php on line 72 
+0

Итак, что содержит '$ this-> intoPassword' и' $ userDBHash'? Один из них - это не строка, а нечто другое. – 1615903

+0

$ signedPassword содержит пароль, который вызывается $ _POST, а $ userDBHash содержит хэш пароля в базе данных. Значит, это массив? Как я могу его преобразовать? – lukas

+2

Я не знаю, что содержит '$ userDBHash', поскольку код, который его устанавливает, не отображается, однако сообщение об ошибке четко указывает, что это не строка, а объект. Из вашего кода я бы предположил, что это может быть PDOStatement: '$ userDBHash-> execute();' – 1615903

ответ

2

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

private function getPasswordHashFromDatabase($username) 
{ 
    $pdo = $this->databaseWrapper->getPDO(); 
    $stmt = $pdo->prepare('SELECT password FROM users WHERE username = ?'); 
    $stmt->bindParam(1, $username); 
    if ($stmt->execute()) 
    { 
    if ($row = $stmt->fetch()) 
    { 
     return $row[0]; 
    } 
    } 
    return ''; 
} 

Обратите внимание на ? в операторе отбора, используя подготовленные заявления защищает приложения от SQL-инъекций.

+0

** Редактировать Это работает очень хорошо! Сначала я провалился .. Я никогда не делал $ _POST для пароля .. теперь он работает :) Большое спасибо! – lukas

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