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」に追記を行ったコードです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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行目のように変更します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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」で、追記する内容は下記のような内容です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// 追加の認証条件をチェックする 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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4でテンプレートやレイアウトファイルをデフォルトから変更する場合は「render()」を使用するが、記述場所はできるだけコントローラー内の最後の方に書く方がいい。
-
-
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
CakePHP3で検索をするプラグイン「friendsofcake/search」の検索条件のカスタマイズ方法の解説。検索項目を増やしたり、以上、以下での検索や、チェックボックスによる検索の方法などを解説。
-
-
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
CakePHPの同一テーブルにある項目の値を比較し条件に合致するレコードを取得する方法を解説。[”項目名”=>”値”]ではなく[”項目名 = 項目名”]と書くところがポイント。
-
-
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!
-
-
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製UsersプラグインのCakePHP4版の紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。