エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法

      2025/03/23

CakePHP4、5のユーザ認証の標準的な設置方法

 
CakePHP4系、CakePHP5系でログイン認証を作成する場合は、下記のチュートリアルに詳しく書かれていますので、参考にしてください。
 
Cookbook CMS チュートリアル – 認証
https://book.cakephp.org/4/ja/tutorials-and-examples/cms/authentication.html
https://book.cakephp.org/5/ja/tutorials-and-examples/cms/authentication.html
 
ID(E-Mailなど)、PASSによるログイン認証は、上記のチュートリアル通りに追記すれば、実装することができるかと思います。(CakePHP5系の公式サイトは一部記載ミスがあります。)
 
さらに詳しく確認したい方は、この記事の最後の方にまとめて関連リンクを貼っていますので、併せて参考にしてください。
 
 

CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法

 
さて、この記事では一般的な ID、PASSによるログイン認証処理に加え、
例えば、
・「削除フラグ」で論理削除したユーザはログイン不許可にしたい
・利用期限を過ぎたユーザはログイン不許可にしたい
というような条件を追加したい場合の対処方法を解説します。
 
 

CakePHP4系、CakePHP5系のログイン処理の標準的な記述

 
https://book.cakephp.org/5/ja/tutorials-and-examples/cms/authentication.html#id3
 
下記は、上記の「ログインの追加」の手続きで「/src/Controller/UsersController.php」に追記を行ったコードです。
 

public function login()
{
  $this->request->allowMethod(['get', 'post']);
  $result = $this->Authentication->getResult();
  // POST, GET を問わず、ユーザーがログインしている場合はリダイレクトします
  if ($result && $result->isValid()) {
    // redirect to /articles after login success
    $redirect = $this->request->getQuery('redirect', [
      'controller' => 'Articles',
      'action' => 'index',
    ]);

    return $this->redirect($redirect);
  }
  // ユーザーが submit 後、認証失敗した場合は、エラーを表示します
  if ($this->request->is('post') && !$result->isValid()) {
    $this->Flash->error(__('Invalid username or password'));
  }
}

 
 

CakePHP4系、CakePHP5系のログイン処理に認証条件を追加した処理

 
上記の 7行目~ 13行目を、下記の 8行目~ 24行目のように変更します。
 
 

public function login()
{
  $this->request->allowMethod(['get', 'post']);
  $result = $this->Authentication->getResult();
  // POST, GET を問わず、ユーザーがログインしている場合はリダイレクトします
  if ($result && $result->isValid()) {

    // 追加の認証条件をチェックする
    $additionalChecksResponse = $this->Users->additionalChecks($result->getData()["id"]);
    if(!$additionalChecksResponse){

      // false の場合はメッセージを編集して、ログアウト
      $this->Flash->error(__('Invalid username or password'));
      $this->Authentication->logout();

    } else {

      // redirect to /articles after login success
      $redirect = $this->request->getQuery('redirect', [
        'controller' => 'Users',
        'action'     => 'index',
      ]);

      return $this->redirect($redirect);
    }
  }
  // ユーザーが submit 後、認証失敗した場合は、エラーを表示します
  if ($this->request->is('post') && !$result->isValid()) {
    $this->Flash->error(__('Invalid username or password'));
  }
}

 
 
続けて、8行目で呼び出している「additionalChecks()」関数を追加します。
 
対象ファイルは「/src/Model/Table/UsersTable.php」で、追記する内容は下記のような内容です。
 

// 追加の認証条件をチェックする
public function additionalChecks($id=null)
{
  // 戻り値を初期化
  $checkResult = false;

  // 引数を確認
  if(!$id){
    return $checkResult;
  }

  // 現在の日時を取得
  $nowTime = FrozenTime::now();

  // ログインできる条件を設定
  $conditions = [
    "id"           => $id,     // ログインユーザのID
    "deleted"      => null,    // 削除フラグ:論理削除されている場合は「1」が入る想定
    "limit_time >" => $nowTime // 利用期限:利用期限の日時が過ぎている場合はログインできない
  ];

  // exists() でユーザ情報の有無を確認
  if($this->exists($conditions)){
    // ユーザ情報があれば true を編集
    $checkResult = true;
  }

  return $checkResult;
}

 
「UsersTable.php」の「additionalChecks()」で、条件に合致するユーザ情報があるか否かをチェックし、あれば「true」、なければ「false」を返し、「false」であればログアウトをして、ログイン画面にリダイレクトする、という処理になります。
 
 
上記の「additionalChecks()」に追記するソースはサンプルですので、実装したいログイン認証の条件に変更してください。
 
この方法は、柔軟なログイン認証の条件を設定することができる点が優れています。
 
例えば、Usersテーブルではなく
 「ユーザ」は「会社」に所属している
というようなテーブル構造の場合でも、「ユーザ」と連携している「会社」テーブルを条件に加えることも難しくありません。
 
 
また、「UsersController.php」の 9行目の「$result->getData()["id"]」で、ログインしたユーザの IDを取得しています。
処理について詳しく知りたい方は「」に記事を書いていますので参考にしてください。
 
 
※ログイン認証の処理自体に、認証条件を追加する方法もあるようなのですが...
 
 

CakePHP4系、5系で「Authentication」を使用した認証処理の実装方法

 
CakePHP4系、CakePHP5系では Authenticationというプラグインを使用して、認証処理を行います。
CakePHP4系では Authentication Ver.2 を使用し、CakePHP5系では Ver.3 を使用します。
 
CakePHP Authentication Ver.2
https://book.cakephp.org/authentication/2/ja/index.html
 
CakePHP Authentication Ver.3
https://book.cakephp.org/authentication/3/ja/index.html
 
 
実装方法は、下記の CakePHPオフィシャルサイトに詳しく紹介されていますので、おおよそ問題はないんじゃないかと思います。
 
Cookbook CMS チュートリアル – 認証
https://book.cakephp.org/4/ja/tutorials-and-examples/cms/authentication.html
https://book.cakephp.org/5/ja/tutorials-and-examples/cms/authentication.html
 
Cookbook シンプルな認証と認可のアプリケーション
https://book.cakephp.org/4/ja/tutorials-and-examples/blog-auth-example/auth.html
https://book.cakephp.org/5/ja/tutorials-and-examples/blog-auth-example/auth.html
 
ただ、1点だけ、CakePHP5系では、公式サイトの記述が間違っている点がありますので、下記の記事を確認していただいて、対応をしてください。
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
 
 
また、ログイン認証処理を組み込んだうえで、ログインしているか否かをチェックする方法、ログインしているユーザの情報を取得する方法について下記の記事で解説しています。
 
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
 
CakePHP4系、CakePHP5系のユーザ認証処理では複数の方法がありますので、状況と好みで選択するといいかと思います。
 
 

CakePHP5の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
getParam('action')で取得するアクション名は別関数に移動しても不変
CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
 
その他の「CakePHP5」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説

responseの値を指定する方法は3系では「body」だが、4系では「withStringBody」になりる。加えてJSON形式なら「withType」で指定するなど4系では結構異なる処理がある。

CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説

WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。

CakePHPで Auto Incrementを外すと Duplicate entry '0' for keyのエラーが出るかも
CakePHPで Auto Incrementを外すと Duplicate entry ‘0’ for keyのエラーが出るかも

CakePHPでAuto Incrementの設定を変更したときに「Duplicate entry ‘0’ for key」のエラーが出た。原因はModel内で IDを編集する処理の追加を忘れていたからだった。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法

CakePHP4のクリエビルダーを使って複数のOR条件をANDでつなぐSQL文を作成する方法を解説。OR条件を記述したwhere句を2つつなげて記述する。

CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説

CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。

CakePHP3のForm Helperの使い方のまとめ

CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合

ID以外のカラムでアソシエーション(連携)させるための考え方とサンプルソースを用いての説明を行っています。

CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた

CakePHPでレコードを新規登録をする際にnewEmptyEntity()を使って空のEntityを作成するが、これのempty、is_nullなどのでの判定結果がtrueかfalseか確認してみた。

CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説

CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。