操作
Bug(バグ) #2585
完了自動ログイン状態のメンバをログイン停止にしたとき最初の一回だけログインに成功してしまう
開始日:
2011-11-07
期日:
進捗率:
100%
予定工数:
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)
説明
概要¶
自動ログイン状態のメンバをログイン停止にしたとき最初の一回だけログインに成功してしまう.
確認環境¶
OnenPNE 3.7.0-dev (master)
OpenPNE 3.6.0 (stable-3.6.x)
再現手順¶
- 自動ログインで直接ホームを表示したあとログイン停止になった状態
- 期待される結果:何らかのページを開くときにログイン画面に遷移する
- ブラウザAでログイン画面を表示する
- ブラウザAでSNSに自動ログインを有効にしてログイン
- ブラウザA終了
- ブラウザB:管理画面でログイン停止を行う
- ブラウザAを立ち上げてSNSにアクセス
- ブラウザAでSNSホーム画面の表示を行う
- ログイン画面が表示される必要がある
原因¶
#1985 での実装に不備があったため.
再現手順の際では,下記コード部334行目でopAnonymousMemberのオブジェクトが返ってくるため337行目の条件がfalseになり,次の342行目で自動ログインのメンバを取得するが,このメンバがログイン停止状態かどうかを判定する処理が抜けている.
lib/user/opSecurityUser.class.php
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 }
実装案¶
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()
参考¶
操作