操作
Backport(バックポート) #2586
完了自動ログイン状態のメンバをログイン停止にしたとき最初の一回だけログインに成功してしまう
開始日:
2011-11-07
期日:
進捗率:
100%
予定工数:
説明
概要¶
自動ログイン状態のメンバをログイン停止にしたとき最初の一回だけログインに成功してしまう.
確認環境¶
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()
参考¶
Kousuke Ebihara さんが約13年前に更新
- 優先度 を Normal(通常) から Urgent(急いで) に変更
- 対象バージョン を OpenPNE 3.6.x から OpenPNE 3.6.1 に変更
Yuya Watanabe さんが約13年前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 7eabceac2bb1f5ed352e4a94811526195f84798d で適用されました。
Kousuke Ebihara さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが約13年前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。
操作