Symfony2 Security Encoders не распознает экземпляр UserInterface - PullRequest
3 голосов
/ 03 марта 2012

Я недавно начал настраивать безопасность для моего проекта Symfony2. Я решил кодировать с sha256, используя соль. Когда я пытался войти в систему с образцом учетной записи в базе данных (с помощью самосчитанного значения sha256 salt / hash), он продолжал давать сбой без каких-либо сообщений об ошибках, и я не мог понять, почему. Я решил поместить простой код в метод 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?

П.С .: База данных была создана кем-то другим, мне просто нужно с ней работать. Таблица Users содержит намного больше информации, чем требуется для UserInterface.

1 Ответ

10 голосов
/ 04 марта 2012

Неважно, я идиот.

Я забыл, что помимо включения класса UserInterface, вы также должны убедиться, что ваш класс реализует UserInterface.

Я изменил это на:

class Users implements UserInterface

Теперь работает отлично.

...