CakePHP

CakePHP ブラウザ終了でログアウト(セッションクッキーの有効期限)

CakePHPの認証機能「Auth」を利用しているが、ユーザー(ブラウザ)の操作とその結果表示で、どうにかならないかなぁ、と思っている点が2つある。

1つは、ログアウト後のブラウザの戻るボタン操作で、ログイン中の管理画面が表示されないようにできないか、ということ。

もう1つは、ログイン中にブラウザを終了し、その後ブラウザを起動してサイトの管理画面に再接続したとき、ログイン状態を破棄して再ログインを要求できないか、ということ。

前者は、まだいい解決法が見いだせていないが、糸口になりそうな点があったので最後に。

さて、ログイン時のセッションの有効期限だが、「config/core.php」の「Security.level」に「midium」をセット して、デフォルトで3時間20分となる。なので、ここを短くするように「Session.timeout」を変更する。すると、今度は管理画面でデータ入 力中にもかかわらず、セッションが切れてしまい不便な目にあう。ここを短縮することなく、ブラウザを終了したらセッションは切れて欲しいわけだ。

う~ん、どうしようか、お茶にしようか、で、おやつはCookieですよ。そうだ、クッキーの有効期限はどうなっているんだろう?と、FirefoxのCookieの表示で有効期限を見ると、7日も先になっておりますがな(ヾ(-_-;) オイオイ)。

ここの有効期限を変更すればいいんだね、ってことで試しにクッキーを削除してみる。

setcookie(Configure::read('Session.cookie'), '', 0);

お見事!これで、ログイン中にブラウザを終了すれば、セッションが継続されず再ログインになった。

「setcookie」コマンド使わなくても、プログラムを実行する際のセッション開始で、セッションクッキーの有効期限を「セッション終了時」に したいので、CakePHPコアモジュールに禁断のパッチを当てることにする。ファイルは「cake/libs/session.php」で、 「__initSession()」関数にあるメンバ変数「cookieLifeTime」への設定値を「0」にした。

case 'medium':
    //$this->cookieLifeTime = 7 * 86400;
    $this->cookieLifeTime = 0;

次に最初にあげた、ログアウト後にブラウザの戻るボタンで管理画面を表示しないようにする、方法について。

ブラウザのキャッシュに残っている情報を表示しているため、サーバー側から直接いじれないというのが、検索した結果の大方の意見。HTMLのheaderタグ下にmetaタグで、

  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Cache-control" content="no-cache" />
  <meta http-equiv="Expires" content="-1" />

など、いろいろと試すがどーにもならない。metaタグって役に立ってるの? オリャ(ノ-o-)ノ ┫;:・.

同じ「session.php」ソースの1つ下にある「__sessionStart()」関数を見ると、

  session_cache_limiter ("must-revalidate");
  session_start();

と、何やら怪しげな設定。で、「nocache」とパッチを当てると、戻るボタンで見事に表示しなくなった。

しか~し、問題が。フォーム入力で、JavaScriptの履歴戻る「history.back()」で戻ると、当然それまでの入力は何も残っていない(これは、リロードされているのかな?)。

ということで、このお話の続きはあるのか、ないのか……

補足:
CakePHP 1.2.0.7692-rc3で動作テスト