プロジェクト

全般

プロフィール

Bug(バグ) #2585

Yuya Watanabe12年以上前に更新

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

戻る