CakePHP3で論理削除されたユーザーではログインできないようにしたい
ユーザーテーブルで論理削除を使うパターンってあると思います。
自分のサービスでもそうでした。
その場合、ある設定をしなければ削除されたユーザーでもログインできてしまいます。
物理削除なら問題ないですが、論理削除なら以下の設定が必須です。
見ていきましょう。
【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7
Authコンポーネントにfinder項目を追加する
Authコンポーネントが書いてあるコントローラがありますよね。
Authコンポーネントとは?という方は以下を参照してください。
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の場合だけに絞り込んでいます。
これで削除されたユーザーでログインすると、エラーが出ます。