2012-03-16 9 views
5

No puedo autenticar en symfony2 con la entidad 'Employee' ya que contiene muchos mapeos con otros entidades en mi proyecto. algunos de mis mapas son los siguientes:Excepción: Symfony Component Security Core Authentication Token UsernamePasswordToken :: serialize() debe devolver una cadena o NULL

/** 
    * @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; 

La autenticación funciona bien sin ningún mapeo. He tratado con 'Serialize()' y 'unserialize()' métodos en él, como a continuación:

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); 
      } 

estoy recibiendo el siguiente error después de hacer el método anterior:

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. 

me han tratado de esta manera con el fin de deshacerse del error anterior, que es la siguiente:

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

Por lo tanto, puede alguien por favor sugerir una manera de superar este problema?

Respuesta

19

He encontrado algo similar, y después de algunas investigaciones, intenté las mismas cosas que tú.

Pero en algún momento, descubrí que estableciendo el método __sleep, todo funcionaba bien.

 
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'); 
    } 
... 
  • Asegúrese de que el campo que se define como @ORM\Id es parte de la matriz devuelta.
  • Asegúrese de soltar la cookie del navegador, ya que utiliza la sesión.

No sé exactamente por qué causa esta hora de crear una nueva asociación (el mío era un ManyToMany), pero probablemente procedente de este lugar:

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

la esperanza que esto podría ayudar a alguien.

Editar:

Referencias:

+0

Muchas gracias !!! ¡Muy útil! – Ben

+0

me ha ahorrado mucho tiempo depurando, gracias –

+1

Creo que este mensaje de error aparece cuando su entidad de usuario tiene una relación que vincula al usuario, por ejemplo: 'Usuario-> Artículo-> Autor' (' Usuario' tiene muchos 'Artículos 'y' Article' tiene 'User' como autor) y luego falla la serialización. Por eso, cuando serializas 'Usuario' usando solo la clave principal (id) todas las cosas se hacen bien. Entonces, usa la función '__sleep' y devuelve la clave primaria allí. – Dmitriy

2

Para mí sólo esto funcionó:

class User implements UserInterface

a

class User implements UserInterface, \Serializable

y necesitaba agregar los siguientes métodos a User clase:

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

public function unserialize($data) { 
    $this->username = unserialize($data); 
} 
0

debes elegir "protegido" en todas las variables de la clase de usuario. Al menos para mí ese trabajo :)

Cuestiones relacionadas