CakePHP ブラウザを閉じたらSESSIONを破棄

CakePHPで『ブラウザを閉じるとSESSIONを破棄』をしたかったので、メモも兼ねて紹介します。

手っ取り早い方法としては、『/app/config/core.php』の200行目付近の『Security.level』を『high』に変更します。

『Security.level』に『high』を指定していると、『/cake/libs/cake_session.php』の480行目付近で

if ($this->security == 'high') {
    $this->cookieLifeTime = 0;
} else {
    $this->cookieLifeTime = Configure::read('Session.timeout') * (Security::inactiveMins() * 60);
}

となり、『cookie_lifetime』に0が指定されます。
さらに、『Security.level』が『high』だと、リクエストごとにSESSION ID が作られるようになります。


しかし、『Security.level』が『high』だと色々と不都合があったりしますよね・・・
『Security.level』が『medium』のまま『ブラウザを閉じるとSESSIONを破棄』する方法は以下のようにして行います。

まずは、『/app/config/core.php』の127行目付近の『Session.save』を好きな名前に変更します。

▼『Session.save』を変更

// ▼変更前
// Configure::write('Session.save', 'php');

// ▼変更後
Configure::write('Session.save', 'new_session');

次に、『Session.save』で指定した名前のPHPファイルを『/app/config/』に作成します。
上記の例だと、『new_session.php』となります。
『new_session.php』の内容は、『/cake/libs/cake_session.php』の487行目付近のswitch文で色々書かれている『ini_set』関数たちをコピーしてきます。

▼『new_session.php』の内容

<?php
    ini_set('session.use_trans_sid', 0);
    ini_set('session.name', Configure::read('Session.cookie'));

    // ↓cookie_lifetimeに0を指定する
    ini_set('session.cookie_lifetime', 0);

    ini_set('session.cookie_path', $this->path);
?>

これで、『Security.level』が『medium』のまま『ブラウザを閉じるとSESSIONを破棄』することができます。

注意点は『Session.save』に[cake][database][php][cache]などを指定しないことです。
[cake][database][php][cache]のいずれかを指定してしまうと、
『/cake/libs/cake_session.php』の487行目付近のswitch文のcaseに該当してしまうので、自分で作成したファイルを読み込みません。