最近、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 で必要な情報だけでなく、さらに多くの情報が含まれています。