CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3 CakeDC/Usersで所有レコードのみ閲覧、更新、削除する権限設定方法
CakePHP3のユーザ管理プラグイン「CakeDC/Users」を使用して権限管理をする際の前提条件
この記事では、下記を実装するための解説です。
- CakePHP3で、ユーザ管理プラグイン「CakeDC/Users」を使用してユーザ管理をするシステムを構築している。
- その中で、ユーザAが登録した情報は、ユーザAが所有者として登録され、その登録情報はユーザAのみが見ることができ、更新、削除も所有者 Aのみが行える。
という機能を実装することを想定しています。
まず、CakePHP3にユーザ管理プラグイン「CakeDC/Users」を導入する方法については、下記の記事を参考にしてください。
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
また、「/config/users.php」「/config/permissions.php」ファイルを作成し、ログイン認証に関連する設定を記述していく方法については、下記の記事を参考にしてください。
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説
これを踏まえた上で、「/config/permissions.php」ファイルに、権限を設定していく方法を解説していきます。
「/config/permissions.php」ファイルのサンプル
「/config/permissions.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 |
<?php use Cake\ORM\TableRegistry; use CakeDC\Auth\Rbac\Rules\Owner; return [ 'Users.SimpleRbac.permissions' => [ [ 'role' => ['user'], 'plugin' => 'CakeDC/Users', 'controller' => 'Users', 'action' => ["profile","logout"], ], [ 'role' => ['user'], 'controller' => ['Blogs'], 'action' => ["edit","delete"], 'allowed' => new Owner([ 'ownerForeignKey' => 'user_id', ]), ], ] ]; |
上記の前半は、ユーザ権限が「user」の場合、プラグインが「CakeDC/Users」で、コントローラーが「Users」の処理のうち、アクションが「profile」もしくは「logout」である場合はアクセスを許可する、という設定になっています。
指定する処理が複数ある場合は、「'action' => ["profile","logout"],
」の様に配列で指定します。
「'role' => ['user'],
」のように、指定するものが 1つしかない場合でも配列で指定することもできますので、全部配列で指定する、と覚えておいても問題はないでしょう。
ログアウトのアクションは必ず登録する
ちなみに、この権限設定をする場合は、何はともあれ下記のログアウトの処理だけは記述しておくようにしておきましょう。
これがないとログアウトできなくなります。
1 2 3 4 5 6 |
[ 'role' => ['user'], 'plugin' => 'CakeDC/Users', 'controller' => 'Users', 'action' => "logout", ], |
「*」を使ってすべての処理を許可対象にすることもできる
また、下記のように、具体的な処理を指定するのではなく、「*」を指定することで、すべての処理を許可する、という指定方法もあります。
1 2 3 4 5 6 7 8 |
[ 'role' => 'user', 'prefix' => 'member', 'extension' => '*', 'plugin' => '*', 'controller' => '*', 'action' => "*", ], |
上記は、会員用のコンテンツ「http://example.com/member/」をすべて利用を許可する、という指定になります。
「superuser」は設定しなくてもすべての機能にアクセスできる
下記の設定は、「『superuser』はすべての機能にアクセスできる」という設定ですが、これはわざわざ設定しなくても、『superuser』はすべての機能にアクセスできます。
1 2 3 4 5 6 7 8 |
[ 'role' => 'superuser', 'prefix' => '*', 'extension' => '*', 'plugin' => '*', 'controller' => '*', 'action' => "*", ], |
所有権限があるレコードのみ更新、削除ができる設定
最初のサンプルの後半部分の下記は、コントローラー「Blogs」で管理されるブログ記事を、アクション「edit(更新)」や「delete(削除)」できるのは、ログインしているユーザの「user_id」が、テーブル「blogs」にある「user_id」の値と同じ時のみ処理を許可する、という設定になります。
1 2 3 4 5 6 7 8 |
[ 'role' => ['user'], 'controller' => ['Blogs'], 'action' => ["edit","delete"], 'allowed' => new Owner([ 'ownerForeignKey' => 'user_id', ]), ], |
ちなみに、この設定を行っても、「superuser」権限があるユーザは、他のユーザのレコードも更新、削除することができます。
(「superuser」のユーザが更新しても、テーブル「blogs」にある「user_id」の情報は更新されません。)
所有権限があるレコードのみ更新、削除ができる設定・別テーブルに IDを持っている場合
上記は、レコードの所有者の情報が保存されているカラム「user_id」が、更新するレコードと同じテーブル内にある場合の設定ですが、所有者情報を管理しているテーブルが別のテーブル「BlogsUsers」にある場合は、以下のように設定します。
1 2 3 4 5 6 7 8 9 10 |
[ 'role' => ['user'], 'controller' => ['Blogs'], 'action' => ["edit","delete"], 'allowed' => new Owner([ 'table' => 'BlogsUsers', 'id' => 'post_id', 'ownerForeignKey' => 'user_id', ]), ], |
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
-
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。
-
-
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。
-
-
CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
-
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。