プロジェクト

全般

プロフィール

Bug(バグ) #2585

Yuya Watanabe さんが約13年前に更新

h3. 概要 

 自動ログイン状態のメンバをログイン停止にしたとき最初の一回だけログインに成功してしまう. 

 h3. 確認環境 

 OnenPNE 3.7.0-dev (master) 
 OpenPNE 3.6.0 (stable-3.6.x) 

 h3. 再現手順 

 * 自動ログインで直接ホームを表示したあとログイン停止になった状態 
 ** 期待される結果:何らかのページを開くときにログイン画面に遷移する 
 # ブラウザAでログイン画面を表示する 
 # ブラウザAでSNSに自動ログインを有効にしてログイン 
 # ブラウザA終了 
 # ブラウザB:管理画面でログイン停止を行う 
 # ブラウザAを立ち上げてSNSにアクセス  
 # ブラウザAでSNSホーム画面の表示を行う 
 ** ログイン画面が表示される必要がある 

 h3. 原因 

 #1985 での実装に不備があったため. 

 再現手順の際では,下記コード部334行目でopAnonymousMemberのオブジェクトが返ってくるため337行目の条件がfalseになり,次の342行目で自動ログインのメンバを取得するが,このメンバがログイン停止状態かどうかを判定する処理が抜けている. 

 lib/user/opSecurityUser.class.php 
 <pre> 
 331     public function initializeUserStatus() 
 332     { 
 333       opActivateBehavior::disable(); 
 334       $member = $this->getMember(); 
 335       opActivateBehavior::enable(); 
 336  
 337       if ($member->getIsLoginRejected()) 
 338       { 
 339         $this->logout(); 
 340         $isSNSMember = false; 
 341       } 
 342       elseif ($memberId = $this->getRememberedMemberId()) 
 343       { 
 344         $this->setMemberId($memberId); 
 345         $isSNSMember = true; 
 346       } 
 347       elseif ($member instanceof opAnonymousMember) 
 348       { 
 349         $this->logout(); 
 350         $isSNSMember = false; 
 351       } 
 352       else 
 353       { 
 354         $isSNSMember = (bool)$member->getIsActive(); 
 355       } 
 356  
 357       $this->setIsSNSMember($isSNSMember); 
 358       if ($isSNSMember) 
 359       { 
 360         $member->updateLastLoginTime(); 
 361       } 
 362     } 
 </pre> 

 h3. 実装案 

 <pre> 
 diff --git a/lib/user/opSecurityUser.class.php b/lib/user/opSecurityUser.class.php 
 index be67cc6..25f8392 100644 
 --- a/lib/user/opSecurityUser.class.php 
 +++ b/lib/user/opSecurityUser.class.php 
 @@ -334,19 +334,13 @@ class opSecurityUser extends opAdaptableUser 
      $member = $this->getMember(); 
      opActivateBehavior::enable(); 
 
 -      if ($member->getIsLoginRejected()) 
 -      { 
 -        $this->logout(); 
 -        $isSNSMember = false; 
 -      } 
 -      elseif ($memberId = $this->getRememberedMemberId()) 
 +      if ($memberId = $this->getRememberedMemberId()) 
      { 
        $this->setMemberId($memberId); 
        $isSNSMember = true; 
      } 
      elseif ($member instanceof opAnonymousMember) 
      { 
 -        $this->logout(); 
        $isSNSMember = false; 
      } 
      else 
 @@ -354,11 +348,20 @@ class opSecurityUser extends opAdaptableUser 
        $isSNSMember = (bool)$member->getIsActive(); 
      } 
 
 +      if ($this->getMember()->getIsLoginRejected()) 
 +      { 
 +        $isSNSMember = false; 
 +      } 
 + 
      $this->setIsSNSMember($isSNSMember); 
      if ($isSNSMember) 
      { 
        $member->updateLastLoginTime(); 
      } 
 +      else 
 +      { 
 +        $this->logout(); 
 +      } 
    } 
 
    public function isMember() 
 </pre> 

 h3. 参考 

 http://redmine.openpne.jp/issues/1985#note-22

戻る