2017-02-19 13 views
-1

これは私が自分のパスワードを設定する方法である:ハッシュされたパスワードとcreateQueryBuilder()

$member->setPassword(password_hash($_POST['pw1'], PASSWORD_DEFAULT)); 

パスワードが正しいかどうかを確認するために、私は単純にこのコードを使用することができます:

if(password_verify($password, $hashed_pw)) { // $hashed_pw is not set, since this is just an example 
    // Do something here 
} 

これまでのところ、すべてがあります良い。

問題

私はこの方法でクエリを構築しています:パスワードはハッシュ化されていない場合

private function getData($username, $password) { 
    // Getting the data 
    $query = $this->getDoctrine()->getRepository('AppBundle:Members') 
     ->createQueryBuilder('t') 
     ->where('t.email = :email') 
     ->andWhere('t.password = :password') 
     ->setParameter('email', $username) 
     ->setParameter('password', $password) 
     ->getQuery(); 
    $result = $query->getResult(); 

    // Get the name 
    $name = $result[0]->getName(); 

    // Check if query exists 
    $result = ($result) ? $name : false; 
    return $result; 
} 

すべてがうまく動作します。さて、私の場合、パスワードはハッシュされており、どうやってこの問題を解決できるのか分かりません。

私は完全に混乱しています、どんな助けも非常に高く評価されるでしょう!

+0

symfonyを使用しているときに、フレームワークが提供するツールの使用を検討しましたか? https://symfony.com/doc/current/security/entity_provider.html – lxg

答えて

1

が私の答えです:

private function verifyUser($username, $password) { 
    $em = $this->getDoctrine()->getManager(); 
    $qb = $em->createQueryBuilder(); 
    $qb->select('m') 
     ->from('AppBundle:Members', 'm') 
     ->where('m.email = :email') 
     ->andWhere('m.password = :password') 
     ->setParameter('email', $username) 
     ->setParameter('password', $password) 
    ; 
    $member = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult(); 

    if($member == null) { 
     $result = null; 
    } 
    else{ 
     $result = $member->getName(); 
    } 

    return $result; 
} 

説明:それはそれを何があるため、verifyUserにあなたの関数の名前を変更しました。ご覧のとおり、開発者がそれを読んだときには意味があり、将来コードを変更しなければならない場合はサポートしやすくなるように、コードを作成しました。

私はEntityManagerを取得してQueryBuilderを作成し、電子メール&のパスワードを設定したクエリを作成します。 getOneOrNullResult)と電話しています。結果(null)が得られない場合、渡されたパスワードは保存されているパスワードと一致せず、これはユーザーではありません。ない場合は、 - あなただけうまくいけば、それはあなたのデザインのケースがある(このパスワードを持つ一人のユーザーを持っているはずなので

は、私はまた、(それが一致した場合)のみ、結果を返す必要がありますにsetMaxResultsを設定しましたあなたはデザインを再考する必要があります)。

次に、1つのメンバーである$member、または一致しない場合はnullを確認し、それぞれ$resultを返すように設定します。

falsebooleanあり、そしてそれは、この場合にnullを返すために、より良いデザインですので、私は、代わりにfalseの戻り値としてnullを使用。

うまくいけば、それは意味をなさないでしょう。


EDIT#2 - 組み込むパスワードハッシュ

private function verifyUser($username, $password) { 
    $em = $this->getDoctrine()->getManager(); 
    $qb = $em->createQueryBuilder(); 
    $qb->select('m') 
     ->from('AppBundle:Members', 'm') 
     ->where('m.email = :email') 
     ->setParameter('email', $username) 
    ; 
    $member = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult(); 

    if(password_verify($password, $member->getPasswordHash())){ 
     $result = $member->getName(); 
    } 
    else{ 
     $result = null; 
    } 

    return $result; 
} 

は、上記の方法は、あなたが機能getPasswordHash()でそれを取得するには、あなたがあなたのパスワードハッシュメンバーエンティティを保存前提としています。

+0

時間をかけてこの回答を投稿していただきありがとうございます。あなたのコードは明らかに私のものよりもはるかにクリーンなようですが、正直言って私の答えを私と比較すると、私たちが同じ結果を得ているかどうかは確信していません。 'password_verify()'は自分の関数ではないことに注意してください。これはPHPの既存関数(http://php.net/manual/en/function.password-verify.php)と基本的には私の問題点です。 –

+0

はい、私はその機能を知っていますが、コード内で適切に使用しないでください。 'verifyUser'関数の外で呼び出され、' $ password'を渡す必要があります。 –

+0

これは、私は2つの機能を持つことを意味しますか?最初のものは '$ member-> getName()'または 'null'を返す' verifyUser() 'でしょうし、もう一つはおそらくハッシュされたパスワードを返す' getPassword() 'と呼ばれるでしょう。そして、両方の関数の外で 'password_verify()'を使うことができます。もしそうなら、私はまだ2つのクエリが必要ですが、同じ関数ではありません。または私は間違っていますか? –

0

気にしないで、私自身の質問に答えます。私はちょうど別のクエリを作成するために必要な:ここで

private function getData($username, $password) { 

    // Get the PW 
    $query_pw = $this->getDoctrine()->getRepository('AppBundle:Members') 
     ->createQueryBuilder('m') 
     ->where('m.email = :email') 
     ->setParameter('email', $username) 
     ->getQuery(); 
    $result_pw = $query_pw->getResult(); 

    if ($result_pw) { 
     $hashed_pw = $result_pw[0]->getPassword(); 
    } 
    else { 
     $hashed_pw = false; 
    } 

    // Getting the data 
    $query = $this->getDoctrine()->getRepository('AppBundle:Members') 
     ->createQueryBuilder('t') 
     ->where('t.email = :email') 
     ->andWhere('t.password = :password') 
     ->setParameter('email', $username) 
     ->setParameter('password', $hashed_pw) 
     ->getQuery(); 
    $result = $query->getResult(); 

    // Verify the password 
    if(password_verify($password, $hashed_pw)) { 
     // Get the name 
     $name = $result[0]->getName(); 
    } 
    else { 
     $name = false; 
    } 

    // Check if query exists 
    $result = ($result) ? $name : false; 
    return $result; 
} 
+1

そして、その要点は? – Cerad

+1

@Ceradは非常に書かれていない投稿であり、書かれていないコードでもありますので、閉じることをお勧めします。 –

+0

@AlvinBunk投稿が不十分な投稿/コードがすべて閉じられた場合、残っていることはほとんどありません。そして私は2つの質問の背後にある推論を見つけることに興味があります。 – Cerad

関連する問題