2016-08-04 19 views
0

我试图使用Symfony文档here中描述的序列化/ userialize方法来登录用户。Symfony登录序列化/反序列化不工作,无效字符串

当我在ContextListener中转储令牌并尝试反序列化字符串时,我得到一个无效字符串的错误。

用户名字段实际上是电子邮件字段。

UserEntity

/** 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="XXX\UserBundle\Repository\UserRepository") 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity("username") 
*/ 
class User extends AbstractEntity implements UserInterface, AdvancedUserInterface, \Serializable 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(
    *  targetEntity="XXX\UserBundle\Entity\UserRoles", 
    *  inversedBy="users" 
    *) 
    * @ORM\JoinTable(
    *  name="users_user_role", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $roles; 

    /** 
    * @ORM\Column(name="password", type="string", length=64) 
    */ 
    protected $password; 

    /** 
    * @Assert\NotBlank() 
    * @Assert\Length(max=4096) 
    */ 
    protected $plainPassword; 

    /** 
    * @ORM\Column(name="enabled", type="boolean") 
    */ 
    protected $enabled = true; 

    /** 
    * @ORM\Column(name="locked", type="boolean") 
    */ 
    protected $locked = false; 

    /** 
    * @ORM\Column(name="expired", type="boolean") 
    */ 
    protected $expired = false; 

    /** 
    * @ORM\Column(name="expires_at", type="datetime", nullable=true) 
    */ 
    protected $expiresAt; 

    /** 
    * @ORM\Column(name="last_login", type="datetime", nullable=true) 
    */ 
    protected $lastLogin; 

    /** 
    * @ORM\Column(name="confirmation_token", type="string") 
    */ 
    protected $confirmationToken; 

    /** 
    * @ORM\Column(name="password_requested_at", type="datetime", nullable=true) 
    */ 
    protected $passwordRequestedAt; 

    /** 
    * @ORM\Column(name="credentials_expired", type="boolean") 
    */ 
    protected $credentialsExpired = false; 

    /** 
    * @ORM\Column(name="user_default_language", type="string") 
    */ 
    protected $userDefaultLanguage; 

//getters and setters 

public function isAccountNonExpired() 
{ 
    return $this->getExpired(); 
} 

public function isAccountNonLocked() 
{ 
    return $this->getLocked(); 
} 

public function isCredentialsNonExpired() 
{ 
    return; 
} 

public function isEnabled() 
{ 
    return $this->getEnabled(); 
} 

/** 
* @return string 
*/ 
public function serialize() 
{ 
    return serialize([ 
     $this->id, 
     $this->username, 
     $this->password, 
     $this->enabled, 
    ]); 
} 

/** 
* @param string $serialized 
*/ 
public function unserialize($serialized) 
{ 
    list (
     $this->id, 
     $this->username, 
     $this->password, 
     $this->enabled 
     ) = $this->unserialize($serialized); 
} 

当我尝试登录我没有得到任何只是ERR_EMPTY_RESPONSE任何错误。但是当我从ContextListener::handle()方法获得令牌并试图反序列化它时,它说该字符串是错误的。

所以它与序列化到这样做,但我不知道/明白我做错了......

回答

1

没有在你的问题足够的信息,但我想这是多字节字符串的问题在那里。检查日志,在nginx/apache日志文件夹或app/logs文件夹中。或者您可以尝试使用serialize/unserialize函数中的json_encode/decode函数代替serialize/unserialize函数。例如:

public function serialize() 
{ 
    return \json_encode([$this->id]); 
} 

public function unserialize($serialized) 
{ 
    list($this->id) = \json_decode($serialized); 
} 
+0

它的工作,谢谢。 –