2012-03-16 22 views
5

Tôi không thể xác thực trong symfony2 với thực thể 'Employee' vì nó chứa nhiều ánh xạ với nhau thực thể trong dự án của tôi. một số ánh xạ của tôi như sau:Ngoại lệ: Symfony Component Security Core Xác thực Token UsernamePasswordToken :: serialize() phải trả về một chuỗi hoặc 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; 

Xác thực hoạt động tốt mà không cần ánh xạ. Tôi đã thử với 'Serialize()' và 'unserialize()' phương pháp trong nó như dưới đây:

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

Tôi nhận được lỗi sau sau khi thực hiện phương pháp trên:

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. 

Tôi đã cố gắng theo cách này để loại bỏ lỗi trước đó, như sau:

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

Vì vậy, bất kỳ ai cũng có thể đề xuất cách khắc phục sự cố này?

Trả lời

19

Tôi đã gặp phải điều tương tự và sau một số nghiên cứu, tôi đã thử những điều tương tự như bạn đã làm.

Nhưng tại một số điểm, tôi phát hiện ra rằng bằng cách đặt phương thức __sleep, mọi thứ đều hoạt động tốt.

 
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'); 
    } 
... 
  • Hãy chắc chắn rằng các lĩnh vực được định nghĩa là @ORM\Id là một phần của mảng được trả về.
  • Đảm bảo thả cookie của trình duyệt vì nó sử dụng phiên.

Tôi không biết chính xác lý do tại sao nó gây ra điều này khi thiết lập một hiệp hội mới (tôi là một ManyToMany), nhưng nó có thể có nguồn gốc từ nơi này:

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

Hy vọng điều này có thể giúp ai đó.

Edit:

Tài liệu tham khảo:

+0

Cảm ơn bạn rất nhiều !!! Rất hữu ích! – Ben

+0

bạn đã lưu cho tôi rất nhiều thời gian gỡ lỗi, cảm ơn –

+1

Tôi nghĩ thông báo lỗi này xuất hiện khi thực thể người dùng của bạn có quan hệ liên kết ngược với người dùng, ví dụ: 'User-> Article-> Author' (' User' có nhiều 'Bài viết 'và' Article' có 'User' là tác giả) sau đó serialization thất bại. Thats lý do tại sao khi bạn serialize 'User' chỉ sử dụng khóa chính (id) tất cả mọi thứ được thực hiện đúng. Vì vậy, hãy sử dụng hàm '__sleep' và trả về khóa chính ở đó. – Dmitriy

2

Đối với tôi chỉ làm việc này:

class User implements UserInterface

để

class User implements UserInterface, \Serializable

và tôi cần thêm các phương pháp sau để User lớp:

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

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

bạn nên đặt "bảo vệ" trong mỗi biến của lớp người dùng của bạn. Ít nhất cho tôi công việc đó :)

Các vấn đề liên quan