3

最近、Symfony2 プロジェクトのセキュリティの設定を開始しました。ソルトを使用して sha256 でエンコードすることにしました。データベースのサンプル アカウント (自己計算された sha256 ソルト/ハッシュを使用) でログインしようとすると、エラー メッセージが表示されずに失敗し続け、その理由がわかりませんでした。Controller の loginAction() メソッドに簡単なコードを入れることにしました。これは、ユーザーが指定されたフォームを使用してログインに失敗したときに Symfony2 が呼び出すメソッドです。次のコードを入力しました。

$factory = $this->get('security.encoder_factory');
$em = $this->container->get('doctrine')->getEntityManager();
$userRep = $em->getRepository('MyProjectMyBundle:Users');
$user = $userRep->find(2);

$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword('cookie', 'thisisasalt');
$user->setPassword($password);
print($password);

しかし、ログインしようとすると、Symfony2 から次のエラーが表示されました。

Catchable Fatal Error: Argument 1 passed to Symfony\Component\Security\Core\Encoder\EncoderFactory::getEncoder() must be an instance of Symfony\Component\Security\Core\User\UserInterface, instance of MyProject\MyBundle\Entity\Users given, called in /var/www/Symfony/src/MyProject/MyBundle/Controller/MainController.php on line 35 and defined in /var/www/Symfony/vendor/symfony/src/Symfony/Component/Security/Core/Encoder/EncoderFactory.php line 33

つまり、基本的に、 の引数はgetEncoder()のインスタンスでなければならないということですSymfony\Component\Security\Core\User\UserInterface。ただし、MyProject\MyBundle\Entity\Users.php を調べると、次の行で始まります。

<?php
namespace MyProject\MyBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

...

したがって、Users クラスは実際には UserInterface クラスを実装します。UserInterface クラスのすべての関数が含まれています。これらのファイルはすべて、Symfony2 チュートリアルで指示された方法で作成しました。Symfony2 が私の Users インスタンスを UserInterface インスタンスとして認識しない理由は何ですか?

PS: データベースは他の誰かによって作成されました。私はそれを操作する必要があります。Users テーブルには、UserInterface で必要な情報だけでなく、さらに多くの情報が含まれています。

4

1 に答える 1

14

気にしないでください、私はばかです。

UserInterface クラスを含めることに加えて、クラスが UserInterface を実装していることも確認する必要があることを忘れていました。

私はこれを次のように変更しました:

class Users implements UserInterface

今では完璧に動作します。

于 2012-03-04T09:36:46.307 に答える