2016-08-04 12 views
0

symfonyのマニュアルhereに記載されているようにserialize/userializeメソッドを使用して、ユーザにログインしようとしています。Symfony Loginシリアル化/非シリアル化が機能しない、無効な文字列

ContextListener内にトークンをダンプして文字列のシリアル化を解除しようとすると、無効な文字列のエラーが発生します。

usernameフィールドは実際には電子メールフィールドです。

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

ありがとうございます。 –

関連する問題