CakePHP3でログイン時のチェックボックスの有無によってクッキーの寿命を変更する
開発環境は、Windows 10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.7.9。
今回の記事はCakePHP3のAuthComponentを使用した前提で作っていきます。
以下のチュートリアルに基づいて、作っておいてください。
https://book.cakephp.org/3/ja/tutorials-and-examples/cms/authentication.html
CakePHP3のAuthComponentを使用した場合、ログイン時に、発行するクッキーは、/config/app.phpのSessionの欄内の設定に基づき、作られます。デフォルトでは、ログインした際に、ブラウザを閉じたら寿命が終わるクッキーを発行しますが、設定によっては、指定の期間の間、寿命の続くクッキーを発行することができます。
今回は、チェックボックスによって、この寿命を切り替えたいと思います。
/config/app.php内のSessionの欄を以下のように書き換えます。
<?php 'Session' => [ 'defaults' => 'php', 'cookie' => 'twiclone_cookie', // 任意の文字列 'timeout' => 259200, // 180days(分で計測する) 'cookieTimeout' => 259200, // 180days 'autoRegenerate' => false, // 自動でセッションを再生成するのをやめる 'checkAgent' => false, // trueにすると毎回セッションが切れることがある 'ini' => [ 'session.cookie_lifetime' => 15552000, //180days 'session.gc_divisor' => 15552000, 'session.gc_maxlifetime' => 15552000, //180days ], 'use_cookies' => 1, // SessionをCookieにも保存する 'cookie_lifetime' => 15552000 //180days ], ?>
次に、/src/Application.phpを開きます。Application内のbootstrap関数内で、以下のコードを入れます。
<?php if(env("REQUEST_URI") === "/users/login" && isset($_POST["login_saved"]) && $_POST["login_saved"] == 0){ Configure::write('Session.timeout', 0); Configure::write('Session.cookie_lifetime', 0); Configure::write('Session.ini',[ 'session.cookie_lifetime' => 0, 'session.gc_divisor' => 0, 'session.gc_maxlifetime' => 0 ]); } ?>
login.ctpを以下にように書き換えます。
<?= $this->Form->create('f', ['id' => 'login_form']) ?> <?= $this->Form->control('email') ?> <?= $this->Form->control('password') ?> <?= $this->Form->checkbox('login_saved') ?> <?= $this->Form->button('ログイン') ?> <?= $this->Form->end() ?>
JavaScript部分(jQueryで)
$(document).on('submit', '#login_form', function(e){ let checkbox_value = document.forms.f.login_saved.checked ? 1 : 0; });