2017-03-18 4 views
2

私はsecurity.ymlを設定する簡単なログインフォームを作成したテストプロジェクトに取り組んでいます。私はserializeunserializeがエンティティで機能し、セッションからロードしてUserインスタンスを取得し、id、username、passwordとDBのデータを比較することを学びました。これらのパラメータの1つが等しくない場合、ユーザーはログアウトします。ログイン中にユーザーの電子メールが変更されたかどうかを確認するsymfony

public function serialize() { 
    return serialize(array(
     $this->id, 
     $this->username, 
     $this->password 
     )); 
    } 

public function unserialize($serialized) { 
    list(
     $this->id, 
     $this->username, 
     $this->password 
    ) = unserialize($serialized); 
} 

ユーザーがログインしている間にメールが変更された場合は、ログアウトしてもチェックされます。私はserializeunserialize$this->emailを追加しようとしましたが、それは気にしません。どうすればこれを達成できますか?

+0

@gp_sfloverすでに 'EquatableInterface'について読んでいますが、データベースの' $ user'メールをどのように比較できますか?エンティティからクエリを送信したり、そのリポジトリを使用する正しい方法を見つけることができません。 – DrKey

+0

私は答えを追加しました。お知らせ下さい :-)。 –

答えて

1

あなたがUserProviderInterfaceを実装して、データベースに保存され、そこからユーザセッションのインスタンスに格納されているいくつかの賢明な利用者のデータを比較する必要がUser Providerを作成した場合は、最も簡単な方法は、あなたのUserクラスでEquatableInterfaceを実装することです:

public function refreshUser(UserInterface $user) 
    { 
     if (!$user instanceof User) { 
      throw new UnsupportedUserException(
       sprintf('Instances of "%s" are not supported.', get_class($user)) 
      ); 
     } 

     return $this->loadUserByUsername($user->getUsername()); 
    } 
01:あなたはを通して各リクエストで自動的に$ユーザーオブジェクトを更新し、ユーザーのプロバイダを利用するので、あなたがDBを照会する必要はありません そのようにし
use Symfony\Component\Security\Core\User\EquatableInterface; 

class User implements EquatableInterface 
{ 
    public function serialize() { 
     return serialize(array(
      $this->id, 
      $this->username, 
      $this->password, 
      $this->email <--- add the email to serialized data 
      #$this->account->getEmail() <--- you can also add the email from an association 
      )); 
    } 

    public function unserialize($serialized) { 
     list(
      $this->id, 
      $this->username, 
      $this->password, 
      $this->email <--- add the email to unserialize method 
     ) = unserialize($serialized); 
    } 

    /** 
    * @param \Symfony\Component\Security\Core\User\UserInterface $user 
    * 
    * @return bool 
    */ 
    public function isEqualTo(UserInterface $user):bool 
    { 
     if (!$user instanceof User) { 
      return false; 
     } 
     if ($this->username !== $user->getUsername()) { 
      return false; 
     } 
     if ($this->password !== $user->getPassword()) { 
      return false; 
     } 
     # here you make the email comparison 
     if ($this->email !== $user->getEmail()) { 
      return false; 
     } 

     return true; 
    } 
} 

+0

シンプルでとても強力です。どうもありがとうございます。どのような場合にも '$ user instanceof User === false'を教えてください。 – DrKey

+0

@DrKey "_in which case _..."の意味を理解していませんが、データの一貫性を維持し、そのメソッドを直接使用するときには "サポートされていない"ユーザーオブジェクトを渡す必要はありません。 –

関連する問題