2012-03-16 16 views
5

वापस करना होगा, मैं 'कर्मचारी' इकाई के साथ symfony2 में प्रमाणीकृत करने में सक्षम नहीं हूं क्योंकि इसमें अन्य के साथ कई मैपिंग शामिल हैं मेरी परियोजना में इकाइयां। मेरे कुछ मैपिंग निम्नानुसार हैं:अपवाद: सिम्फनी घटक सुरक्षा कोर प्रमाणीकरण टोकन उपयोगकर्ता नामपासवर्ड टोकन :: 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. 

मैं कोशिश की है मैं 'को क्रमानुसार()' और 'Unserialize()' नीचे की तरह उस में तरीकों के साथ की कोशिश की है इस तरह से इतनी के रूप में पिछले त्रुटि से छुटकारा पाने के, के रूप में है जो इस प्रकार है:

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 के रूप में परिभाषित किया गया है लौटे सरणी का हिस्सा है बनाओ।
  • ब्राउज़र कुकी ड्रॉप करने के बाद से यह सत्र का उपयोग करता है सुनिश्चित करें।

वास्तव में क्यों यह इस का कारण बनता है जब एक नया संघ (मेरा एक ManyToMany था) की स्थापना मैं नहीं जानता, लेकिन यह शायद इस जगह से ही शुरू:

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

आशा इस किसी की मदद कर सकते हैं।

संपादित करें:

संदर्भ:

+0

आपको बहुत बहुत धन्यवाद !!! बहुत उपयोगी! – Ben

+0

आपने मुझे बहुत समय डिबगिंग बचाया, धन्यवाद –

+1

मुझे लगता है कि यह त्रुटि संदेश तब प्रकट होता है जब आपकी उपयोगकर्ता इकाई का संबंध उस उपयोगकर्ता से मिलता है जो उपयोगकर्ता को वापस लिंक करता है, पूर्व .: 'उपयोगकर्ता-> आलेख-> लेखक '(' उपयोगकर्ता 'में कई लेख हैं 'और 'आलेख' में लेखक के रूप में' उपयोगकर्ता' है) तो क्रमबद्धता विफल हो जाती है। Thats क्यों जब आप केवल प्राथमिक कुंजी (आईडी) का उपयोग कर 'उपयोगकर्ता' को क्रमबद्ध करते हैं तो सभी चीजें सही होती हैं। तो, '__sleep' फ़ंक्शन का उपयोग करें और वहां प्राथमिक कुंजी लौटाएं। – Dmitriy

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

आप "संरक्षित" रखना चाहिए अपने उपयोगकर्ता वर्ग के हर चर में। कम से कम मेरे लिए यह काम करता है :)

संबंधित मुद्दे