CakePHP3で論理削除されたユーザーではログインできないようにしたい

ユーザーテーブルで論理削除を使うパターンってあると思います。

自分のサービスでもそうでした。

その場合、ある設定をしなければ削除されたユーザーでもログインできてしまいます。

物理削除なら問題ないですが、論理削除なら以下の設定が必須です。

見ていきましょう。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

Authコンポーネントにfinder項目を追加する

Authコンポーネントが書いてあるコントローラがありますよね。

Authコンポーネントとは?という方は以下を参照してください。

AuthComponent - 3.9

CakePHP3の認証[Auth]コンポーネントを用いてログイン機能を実装する

AppControllerに書いたり、自分の場合は[アプリ名]BaseControllerという名前のコントローラに書いています。

このコントローラにあるAuthコンポーネントにある項目を追加します。

(Authコンポーネントが書かれたコントローラ)

$this->loadComponent('Auth',[
            'authorize'=>['Controller'],
            'authenticate'=>[
                'Form'=>[
                    'fields'=>[
                        'username'=>'mail',
                        'password'=>'pass'
                    ],
                    'finder'=>'auth', // 追加した行
                ],
            ],
(以下略)

ご覧の通り、「'finder'=>'auth',」を追加しました。

これでAuthに入ってくる情報を絞り込むことができます。

どうやって絞り込むのでしょうか。

UsersTable.phpにfindAuthファンクションを追加する

見ていきます。

(UsersTable.php

public function findAuth(\Cake\ORM\Query $query, array $options)
    {
        $query
            ->select(['id', 'name', 'mail', 'role', 'gender', 'pass'])
            ->where(['Users.deleted IS' => NULL]); // 削除カラムがNULLの人だけに絞り込む(削除されたユーザーを除外している)

        return $query;
    }

先ほどAuthコンポーネントのfinderで指定した「Auth」ですが、findAuthというファンクションの名前で使われています。

では中身の説明をしていきます。

select()はもしかするとあってもなくてもいいかもしれません。

大事なのは、「where(['Users.deleted IS' => NULL]);」で削除カラムがNULLの人だけに絞り込んでいます。

自分のDBの仕様上、Usersテーブルのdeletedカラムは削除日時が入ります。

なので削除日時が入っていない、つまりNULLの場合だけに絞り込んでいます。

これで削除されたユーザーでログインすると、エラーが出ます。

終わりに

以上となります。

意外と見落としてしまいがちな部分ですが、Authコンポーネントにしっかり設定してあげなければいけません。

注意したい部分ですね。

ありがとうございました。