4

グーグルには多くの解決策がありません(同様の質問ですが答えはありません)。

bcryptは毎回新しいハッシュを生成するため、認証は失敗します。私はコードを調べました(おそらく自分でクラスを拡張します)が、それはかなり厄介です(ネイティブソリューションを好むでしょう)。$bcrpt->verify()でを使用するにはどうすればよい$identity->isValid()ですか?

編集:今のところ、認証DbTableクラスをサブクラス化して機能していますが、最適化されている/「完全に正しい」とは思えません。まだ「エレガントな」ソリューションを探しています。

4

3 に答える 3

15

次を使用できます。

Zend\Authentication\Adapter\DbTable\CallbackCheckAdapter

このような :

use Zend\Authentication\Adapter\DbTable\CallbackCheckAdapter as AuthAdapter;
use Zend\Crypt\Password\Bcrypt;    

$credentialValidationCallback = function($dbCredential, $requestCredential) {
    return (new Bcrypt())->verify($requestCredential, $dbCredential);
};
$authAdapter = new AuthAdapter($dbAdapter, 'user', 'login', 'password', $credentialValidationCallback);
// ...
于 2014-03-16T15:07:53.770 に答える
4

ご存知のように、BCryptはソルトを使用してハッシュします。そして、その塩は毎回ランダムに再び生成されます。これにより、データベースが危険にさらされた場合にすべてのパスワードを見つけるのが大幅に困難になります。したがって、実際には、毎回新しいハッシュが生成されます。

あなたが抱えていた問題に対する私自身の解決策はZend\Authentication、データベースからユーザーモデルを(ユーザー名/電子メールを使用して)取得し、次にを呼び出す独自のアダプターを使用すること$user->checkPassword($credential);です。そのメソッドはのインスタンスを取得しますZend\Crypt\Password\Bcrypt$bcrypt->verify()これは、指定されたパスワードとユーザーモデルのハッシュを呼び出すだけです。

于 2013-01-06T11:25:47.967 に答える
1

私はこのようにそれをしました(テストコードとそれは動作します)..;

if ($request->isPost()) {
            $form->setData($request->getPost());
            if ($form->isValid()) {

                $bcrypt = new Bcrypt();
                $user   = new User();
                $user->exchangeArray($form->getData());

                $password    = $user->password;
                $data        = $this->getUserTable()->selectUser($user->username);

                if (!$data)
                {
                    echo 'user not found';
                } else {

                    if ($bcrypt->verify($password, $data->hash)) {

                    $sm          = $this->getServiceLocator();
                    $dbAdapter   = $sm->get('Zend\Db\Adapter\Adapter');
                    $authAdapter = new AuthAdapter(
                                            $dbAdapter,
                                            'cms_users',
                                            'username',
                                            'hash'
                                        );
                    $authAdapter->setIdentity($user->username)
                                ->setCredential($data->hash);                           

                    $result = $auth->authenticate($authAdapter);
                    echo $result->getIdentity() . "\n\n";
                    // do you thing on succes/failure


                    } else {
                    echo 'invalid password';
                    }
                }
            }
        }
于 2014-03-25T09:38:10.560 に答える