2012-03-16 41 views
5

我無法在symfony2中使用'Employee'實體進行身份驗證,因爲它包含許多與其他映射我的項目中的實體。我的一些映射如下:例外:Symfony Component Security Core Authentication Token UsernamePasswordToken :: serialize()必須返回一個字符串或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; 

身份驗證沒有任何映射工作正常。我試圖與「序列化()」和「反序列化()」在它的方法,如下面:

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 

所以,任何人都可以請提出一個方法,從這個問題要克服?

回答

19

我遇到過類似的事情,經過一番研究,我嘗試了和你一樣的事情。

但在某些時候,我發現通過設置__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,因爲它使用會話。

我不知道爲什麼它會導致此設立一個新的關聯(我的是一個多對多)時,但它可能是從這裏起源:

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

希望這可以幫助別人。

編輯:

參考文獻:

+0

非常感謝你!很有幫助! – Ben 2012-06-06 18:53:42

+0

你節省了我大量的時間調試,謝謝 – 2012-11-12 22:31:22

+1

我認爲當你的用戶實體有一個關係鏈接回用戶時出現這個錯誤信息,例如:User-> Article-> Author'('User' has many Articles '和'Article'有'User'作爲作者),則序列化失敗。這就是爲什麼當你使用唯一主鍵(id)序列化'User'時,所有事情都做得很好。所以,使用'__sleep'函數並返回主鍵。 – Dmitriy 2013-01-21 10:50:38

2

對我來說,只有這個工作:

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

在用戶類的各變量你應該把「保護」。至少對我來說那個工作:)

相關問題