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の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法
CakePHP4のfindListでキーと値のカラムを指定してテーブルにアクセスする方法がCakePHP5では「Deprecated(非推奨)」となった。推奨の記述方法を解説。
-
-
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。
-
-
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。
-
-
CakePHP4、CakePHP5のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。
-
-
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。
-
-
CakePHP3のForm Helperの使い方のまとめ
CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。
-
-
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でレコードを追加、更新(Insert、Update)する記述方法を解説。1件ずつ処理、全件をまとめて処理、条件に該当する複数件のレコードを処理方法をサンプルコードを用いて解説。
-
-
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のクリエビルダーを使って複数のOR条件をANDでつなぐSQL文を作成する方法を解説。OR条件を記述したwhere句を2つつなげて記述する。