LaravelのPolicyを効率的にCRUDメソッドに適用させる方法

Laravelセキュリティ

Laravelでは、Policyを使って、モデルごとに対してアクセスや動作・表示制限をかけられます。

リソースコントローラーにPolicyを適用させる場合、CRUDメソッドに簡単に適用させられます。

便利ながら、トラップもあり。

トラップを避けてリソースコントローラーにPOLICYを適用させる方法を解説していきますね。

LaravelのPolicyを効率的にCRUDメソッドに適用させる方法

今回は、PostモデルのためのPolicyを作ります。

これによって、投稿(Post)を編集したり、削除したりできるのは作成者本人だけ、という制限をかけます。

手順は次のとおり。

  1. Postモデルとコントローラーを作成
  2. Policyファイルを作成
  3. Policyファイルを編集
  4. PostコントローラーにPolicy適用
  5. トラップについて

公式マニュアルはこちら。

Postモデルとコントローラーを作成

Postモデルとマイグレーションファイル、リソースコントローラーを作成します。

下記のようにコマンドを入れると、一度で、この3つのファイルを作成できます。

各メソッドへのコードの記入方法は、ここでは省略させてください。

なお、リソースコントローラーにはCRUD処理に対応したメソッド名が既に入っています。

じゅんこ
じゅんこ

「そもそもCRUDってなに?」と思ったら、こちらから読んでくださいね。

Policyファイルを作成

下記コマンドで、PostモデルのPolicy用ファイルを作成します。

作成後、app/Providersの中の AuthServiceProvider.phpファイルに登録しておきます。

Policyファイルを編集

PostPolicyファイルを開きます。

最初から7つのメソッドが入っていますが、そのうち5つは、リソースコントローラーのメソッドに対応しています。

対応表は次のとおりです。

リソースコントローラーメソッド Policyメソッド
index viewAny
show view
create create
store create
edit update
update update
destroy delete

コントローラーに対応したPolicyメソッドに、制限をいれていきます。

作成した本人だけに許可が編集OKとするなら、次のようにいれます。

本人しか見れない、削除できない、とするなら、同じ記述をviewやdeleteメソッドにも入れておくと良いでしょう。

これでPolicy編集終わり。

PostコントローラーにPolicy適用

コントローラーに、今作成したPolicyを適用させます。

といっても、下記を入れるだけ。

では早速、テストしてみましょう。

トラップについて

おそらく、うまくいかない方が多いと思います^^;

実は、リソースコントローラー対応Policyには、トラップがあります。

わたしが気付いたのは、下記の2か所。

トラップ① 制限がないところにもPolicyを記述せねばならない

たとえば 【create】メソッドは、制限なく、だれでもできるようにしたいとします。

ところが、こういった部分にもPolicyを入れておく必要があります。

そうしないと、このように403エラーになります。

制限がない場合には、PostPolicyのcreateメソッドに、次のように return true をいれておきましょう。

トラップ② デフォルトの引数を変えると動作しない、こともある。

ふたつめのトラップは、コントローラーの中の引数を変えると、動作しないことがあるという点。

たとえば、deleteメソッドはデフォルトでは次のようになっています。

ですが、わたしは次のようにしていました。

すると、またしても 403 unauthorizedエラーが。

デフォルトと変更した箇所がある場合には、動作しない場合があるかもしれません。

そんな場合には、一度、デフォルトに戻してチェックしてみてください。

じゅんこ
じゅんこ

ほんと、融通利かない!と正直思いましたが。

さいごに

今回は、モデルとリソースコントローラーに紐づけたPolicyの使い方を解説しました。

たしかに記述量が少なくて便利ですが、融通が利かない部分もあり。

不便だと感じたら、一か所ずついれておくほうが良いかと思います。

その方法は、こちらの記事をご覧ください。

他にも関連記事で制限のかけかたを色々解説しているので、あなたの状況にあったものを選んでくださいね。

Laravelセキュリティ

【Laravelの教科書・無料プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中! 会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック
【LaravelでWebアプリ開発します】

「会員制サイトを作ってほしい」「開発の時間がないから頼みたい!」

こんなご要望承り中。オンラインミーティングでも、ご相談承ります。

サンプルやお見積もり目安を見てみる

Twitter始めました。
40代からプログラミング!

コメント

タイトルとURLをコピーしました