[CakePHP4]意外と簡単にできるログイン画面に「Remember Me」を導入する

[CakePHP4]意外と簡単にできるログイン画面に「Remember Me」を導入する
2023年10月13日2023年10月13日

Laravelでは、デフォルトで「Remember Me」機能が備わっていますが、CakePHPでもこの機能を手軽に実装することができます。

実際、CakePHPの公式サイトでもこの機能の導入方法が紹介されています。今回は、ログインフォームに「Remember Me」機能を追加する手順について詳しく解説します。

Remember Meとは

12314131241412

「Remember Me」や「自動ログイン」と呼ばれる機能は、ユーザー体験の向上を目指して導入されています。多くのウェブサイトやアプリケーションでは、一定の時間が経過するとセキュリティ上の理由から自動的にログアウトされます。これは、ユーザーが公共の場所や共有のデバイスでアクセスした際に、不慮の事態や第三者による不正アクセスを防ぐためのものです。

しかし、自動ログアウトの機能は、毎回ログイン情報を入力する手間をユーザーに求めるため、一部のユーザーにとっては煩わしさを感じさせることがあります。

「Remember Me」機能は、ユーザーはログイン時に「ログイン状態を保持する」や「次回から自動でログインする」などのオプションを選択することで、再度サイトを訪問した際にログイン情報を入力する手間を省くことができます。これにより、ユーザーはスムーズな利用体験を得ることができるのです。

実装する

前提条件としてログイン処理が実装済みである必要があります。また「authentication」ライブラリをインストールしておく必要があります。

インストールされていない場合は、下記のコマンドでインストールできます。

composer require cakephp/authentication

Application.phpファイルの修正

「Remember Me」機能はCookieを使用しますので、src/Application.php 内に getAuthenticationService メソッドを実装します。

~/src/Application.php
public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
{
    $authenticationService = new AuthenticationService([
        'unauthenticatedRedirect' => '/admin/login',
        'queryParam' => 'redirect'
    ]);

~ログイン処理定義を省略しています~

    // ↓↓↓ ここから追加
    $authenticationService->loadAuthenticator('Authentication.Cookie', [
        'fields' => [ // cookieに保存する値
            'username' => 'login_id',
            'password' => 'password',
        ],
        'rememberMeField' => 'remember_me', // Formのinput name
        'cookie' => [
            'name' => 'RememberMe',  // cookie名
            'expires' => '+30 day',  // 有効期間を設定
        ]
    ]);
    // ↑↑↑ ここまでを追加

    return $authenticationService;
}

次にcookie情報を暗号化するためにEncryptedCookieMiddlewareを読み込むようにmiddlewareメソッドに追加します。

「RememberMe」は上記で設定したcookie.nameと同じ名前にしてください。同じ名前にすることでCakePHPがRememberMeのcookieのvalue値を自動で暗号化してくれます。

~/src/Application.php
public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
    $middlewareQueue->add(new EncryptedCookieMiddleware(
            ['RememberMe'],
            Configure::read('Security.cookieKey')
        ))
        ->add(new AuthenticationMiddleware($this));

    return $middlewareQueue;
}
注意点
必ずEncryptedCookieMiddleware()はAuthenticationMiddleware()の前に定義してください。
順番が逆だとcookieが暗号化されません。

次に、app.phpに暗号化する際に使用するランダム文字列を定義します。

app.phpファイルの修正

~/config/app.php
'Security' => [
    'salt' => env('SECURITY_SALT'),
    'cookieKey' => env('SECURITY_COOKIE_KEY', 'string')
],

「string」部分はランダム文字列にしてください。文字数が少ないとエラーが発生します。

ログインフォームの修正

次に、ログインフォームを修正します。

remember_meのチェックボックスを追加してください。

<?= $this->Form->create() ?>
<fieldset>
    <legend><?= __('Login') ?></legend>
    <?= $this->Form->control('email', ['required' => true, 'label' => 'Email']) ?>
    <?= $this->Form->control('password', ['required' => true]) ?>
    <?= $this->Form->control('remember_me', ['type' => 'checkbox', 'label' => 'Remember me']) ?>
</fieldset>
<?= $this->Form->button(__('Login')); ?>
<?= $this->Form->end() ?>

動作確認

修正が完了したら、正常に動作するか必ず動作確認を行ってください。

また、「Remember Me」機能はクッキーを使用するため、クッキーの値が適切に暗号化されているかを確認することも重要です。

暗号化が正しく行われている場合、以下のような形式で値が保存されているはずです。

21342425

暗号化されていない場合は、ログインIDの文字列が見えてしまいます。セキュリティ的によろしくないので、必ず確認しましょう。

12341231241234

コントローラーのログイン関連の修正は必要ありません。

「Remember Me」のチェックボックスが選択された場合、ログイン時に自動的にクッキーがセットされます。同様に、ログアウト時には自動的にクッキーからその情報が削除されます。

最後に

「Remember Me」機能は、ユーザーにとっての利便性を高めるための重要な機能ですが、セキュリティ上のリスクも考慮しながら実装する必要があります。

適切なセキュリティ対策を講じることで、ユーザーの信頼を損なうことなく、この便利な機能を提供することができます。

コメント

コメントを残す

お名前(任意)
コメント:新規