Backport(バックポート) #2453
Yuya Watanabe さんが約13年前に更新
h3. 概要
ログイン時に自動ログインにチェックを入れているにも関わらず,次回自動ログインは成功するが,その次の自動ログインに失敗する.
失敗する原因として自動ログイン用のCookieが削除されていることが確認されている.
この問題は #2139 によって修正されたはずであるが, #2315 の修正によって再度発生するようになった.
h3. 再現手順
# SNSに自動ログインを有効にしてログイン
# ブラウザ終了
# 同ブラウザでSNSにアクセス
# 同ブラウザ終了
# 同ブラウザでSNSにアクセス
** ログアウト状態となっている
h3. 問題までの処理の流れ
# メンバが「次回から自動的にログイン」にチェックをいれてログインする
** 自動ログイン用のCookieと今回限りのログイン用のCookieがサーバから送られてきてブラウザに保存される
# ブラウザを終了する
** 今回限りのログイン用Cooikeが削除されるが自動ログイン用Cookieは残ったままとなる
# ブラウザを立ち上げてSNSにアクセスする
** 最初は未ログイン状態となりopAnonymousMemberのインスタンスが生成される
** opAnonymousMember生成時にログアウト処理が行われて自動ログイン用Cookieを削除する処理が行われる
** ブラウザから送られて来た自動ログイン用Cookieを用いてopRememberLoginFilterがログインに成功する
** ログインを完了してSNSを表示したときには今回限りのログイン用Cookieが存在するが自動ログイン用Cookieが削除されている状態となる
# ブラウザを終了する
** 今回限りのログイン用Cookieが削除されてなにもない状態となる
# ブラウザを立ち上げてSNSをにアクセスする
** opAmonymouseMemberとしてログイン画面にリダイレクトされる
h3. 原因
#2315 で修正されたコミット( commit:7fc9dfcc ) で下記部分においてopAnonymousMemberのインスタンス生成時にログアウト処理が行われるように修正されたため.
lib/user/opSecurityUser.class.php 330行目
<pre>
321 /**
322 * Initializes all credentials associated and status with this user.
323 */
324 public function initializeUserStatus()
325 {
326 opActivateBehavior::disable();
327 $member = $this->getMember();
328 opActivateBehavior::enable();
329
330 if ($member instanceof opAnonymousMember || $member->getIsLoginRejected())
331 {
332 $this->logout();
333 $isSNSMember = false;
334 }
335 else
336 {
337 $isSNSMember = (bool)$member->getIsActive();
338 }
339
340 $this->setIsSNSMember($isSNSMember);
341 if ($isSNSMember)
342 {
343 $member->updateLastLoginTime();
344 }
345 }
</pre>
h3. 修正方針
h3. 参考
調査を行ったログ: http://redmine.openpne.jp/issues/1985#note-13