Исключение: Symfony \ Component \ Security \ Core \ Authentication \ Token \ UsernamePasswordToken :: serialize () должен возвращать строку или NULL - PullRequest
5 голосов
/ 16 марта 2012

Я не могу пройти аутентификацию в symfony2 с сущностью «Сотрудник», так как она содержит много сопоставлений с другими сущностями в моем проекте.некоторые из моих сопоставлений выглядят следующим образом:

/**
     * @var EmployeeDesignation
     *
     * @ORM\ManyToOne(targetEntity="EmployeeDesignation")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="employee_designation_id", referencedColumnName="id")
     * })
     */
    private $employeeDesignation;

    /**
     * @var EmployeeDesignation
     *
     * @ORM\ManyToOne(targetEntity="EmployeeType")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="employee_type_id", referencedColumnName="id")
     * })
     */
    private $employeeType;

Аутентификация работает без каких-либо сопоставлений.Я пытался использовать методы 'Serialize ()' и 'Unserialize ()', как показано ниже:

class Employee implements AdvancedUserInterface, \Serializable{
     /**
             * serialize the username
             * @return serialize
             */
            public function serialize() {
              return serialize($this->emailOfficial);
            }

            /**
             * unserialize
             * @param $data
             */
            public function unserialize($data) {
              $this->em = unserialize($data);
            }

Я получаю следующую ошибку после выполнения вышеуказанного метода:

You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine. 

Я пробовал этот способ, чтобы избавиться от предыдущей ошибки, а именно:

Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::serialize() must return a string or NULL 

Итак, кто-нибудь может предложить, пожалуйста, способ преодоления этой проблемы?

Ответы [ 4 ]

19 голосов
/ 25 апреля 2012

Я столкнулся с чем-то похожим, и после некоторых исследований я попробовал то же самое, что и вы.

Но в какой-то момент я обнаружил, что, установив метод __sleep, все работает нормально.

class User implements PlayerInterface
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
...

    public function __sleep()
    {
        return array('id');
    }
...
  • Убедитесь, что поле, определенное как @ORM\Id, является частью возвращаемого массива.
  • Обязательно удалите cookie-файл браузера, поскольку он использует сеанс.

Я не знаю точно, почему это происходит при создании новой ассоциации (у меня была ManyToMany), но, вероятно, это происходит из этого места:

// see Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse()
...
        $event->getRequest()
            ->getSession()
            ->set('_security_'.$this->contextKey, serialize($token));
...

Надеюсь, это кому-нибудь поможет.

Edit:

Ссылки:

2 голосов
/ 18 января 2013

Для меня только это сработало:

class User implements UserInterface

до

class User implements UserInterface, \Serializable

и мне нужно было добавить следующие методы к User класс:

public function serialize() {
    return serialize($this->username);
}

public function unserialize($data) {
    $this->username = unserialize($data);
}
1 голос
/ 26 апреля 2012

Есть еще одна возможность решить эту проблему.Вы должны сделать так, чтобы все свойства объектов, связанных с вашим пользователем, отображались как «защищенные»

См .: http://www.metod.si/symfony2-error-usernamepasswordtokenserialize-must-return-a-string-or-null/

0 голосов
/ 12 августа 2013

Вы должны поместить «protected» в каждую переменную вашего классаПо крайней мере, для меня это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...