k01ken’s b10g

He110 W0r1d!

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;
  });