time 2017/10/17
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に該当してしまうので、自分で作成したファイルを読み込みません。