Laravelで本人と管理者以外はプロフィールを更新できなくする方法

Laravelセキュリティ

Laravelの【Policy】機能を使って、本人と管理者以外、プロフィールを更新できなくする方法を解説します。

しっかりとアクセス制限をかけておかないと、不正なアクセスによってユーザーのプロフィールを書き替えられてしまう可能性があります。

Policyの設定方法をステップごとに解説していきますね。

Laravelで本人と管理者以外はプロフィールを更新できなくする方法

今回は、各ユーザーのプロフィール編集ページへの更新に制限をかけていきます。

プロフィール編集ページは、Userテーブルと連携しています。

Laravelでは色々な方法で制限をかけられますが、今回はPolicyを使っていきます。

Policyは、特定のモデルと結び付けて、制限をかけられる方法

Laravelのマニュアルには次のように書かれています。

ポリシーは特定のモデルやリソースに関する認可ロジックを系統立てるクラスです。

*引用元:Laravel8 認可

今回はUserモデルと結び付けていきたいので、ピッタリの機能です。

具体的な手順を5ステップに分けて解説していきますね。

  1. Policyファイルを作成する
  2. Policyファイルを編集する
  3. AuthServiceProviderに登録する
  4. コントローラーに制限をかける
  5. 管理者も編集可能にする

Policyファイルを作成する

まずは下記のコマンドでPolicyファイルを作成します。

コマンドの最後に、結びつけるモデル名をいれておきます。

名前の付け方は、【モデル名+Policy】としておきましょう。

今回はUserモデルに連携させるので、UserPolicyとします。

コマンドを実行すると、app/policiesの中に、ポリシーファイルが作成されます。

モデル名をつけてPolicyファイルを作ると、最初から7つのメソッドが入っています。

Policyファイルを編集する

app/policiesの中にUserPolicy.phpファイルができているので、開きます。

一番上に、use宣言を加えておきます。

public function updateに、下記のように書いておきましょう。

ちょっとわかりにくいのですが、updateの後には、引数が二つ入っています。

最初の引数【User $user】が、今ログインしているユーザー、2つ目の引数【User $model】は、プロフィールに掲載されたユーザーです。

両者が同一人物であれば、trueを返します。

AuthServiceProviderに登録する

作成したPolicyは、AuthServiceProviderに登録します。

app/ProvidersからAuthServiceProvider.phpファイルを開き、下記のように登録しておきましょう。

コントローラーに制限をかける

これで準備OKです。

プロフィールを編集する部分のコントローラーに、今作ったUserPolicyを適用させます。

一度テストしてみましょう

これで一度、テストしてみましょう。

次のようにプロフィール編集ページのルートを設定しているとします。

User部分にログインユーザー以外のIDをいれ、プロフィールページを開こうとしてみます。

403 THIS ACTION IS UNAUTHORIZEDと表示されたら成功。

Policyをリソースコントローラーと効率的に連携させる方法

ここで、ちょっと豆知識。

コントローラーに、メソッドごとに  $this->authorize('メソッド', $user);と入れていくのは面倒です。

実はリソースコントローラーを使う場合、最初にコンストラクタを入れてしまう手があります。

そのあとはコントローラーにPolicyに関する記述を入れずにすみます。

詳しい方法はこちらの記事で解説しているので、ご興味があれば、併せてご覧ください。

じゅんこ
じゅんこ

トラップもあるので、ご注意ください。

そのあたりも、解説しています。

管理者も編集可能にする

最後に管理者もプロフィールを編集できるようにします。

これは、【管理者】権限をどのように設定しているかによって、書き方が変わってきます。

今回はRole(役割)モデルを作り、Userモデルと多対多のリレーションをはってあると想定します。

Roleモデルを作り、リレーションを設定する方法はこちらで解説しています。

Userモデルファイルに、次のような関数を加えます。

UserPolicyファイルの先ほど作成したupdateメソッドを、次のように書き替えます。

これで「ユーザー本人、あるいは管理者権限があるものなら、TRUEを返す」とできました。

再度テストしてみてください。

さいごに

今回は、ユーザープロフィール編集に制限をかける方法を解説しました。

制限がないWebアプリは、不正な操作がいくらでもできてしまいます。

Policyなどを使って、しっかりアクセス制御をしておきましょう。

じゅんこ
じゅんこ

制限がしっかりしたWebアプリを作れれば、顧客の信頼も得られます。

関連記事に他の方法もあるので、併せて参考にしてくださいね。

 

Laravelセキュリティ

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

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

【無料プレゼント】

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

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

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

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

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

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

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

コメント

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