Laravel コントローラミドルウェア

Shop edit,updateの場合ルートパラメータの注意

edit,updateアクションの場合、URLにパラメータを使うときに注意が必要。

たとえば、以下のようなURLの場合、
/owner/shops/edit/2/

IDの2をURL上から直接変更すると他のownerのidのshopがみれてしまうので、
(id2のownerでログインしてるのに3と入れたらid3のownerの情報が見れてしまう)

ログイン済みownerのshopURLであるかチェックして、違ったら404を返す処理を入れる必要がある。
shopコントローラーならshopコントローラーでしかきかないミドルウェアを作ることができる。

readouble.com

ShopControllerのコンストラクタに書いていく。

dd($request->route()->parameter('shop'));としてedit画面へ遷移すると、
id””で囲まれて文字列として認識されている。

また、indexにアクセスするとnullになる。
nullかどうか判定してnullではなかったらURLに書いてあるidパラメータを確認してログインしているownerかどうかチェックして
違ったら404を返す。

dd(Auth::id());とした場合、idは数字になる

→この型を利用して判定をかけていく。

<?php
class ShopController extends Controller
{
    //コンストラクタでミドルウェアを設定しownerで認証していた場合実行する
    public function __construct()
    {
        $this->middleware('auth:owners'); 

        $this->middleware(function ($request, $next) {
            //idは文字列になる
            //indexにアクセスするとnullになる
            //dd($request->route()->parameter('shop'));
            //dd(Auth::id());//idは数字になる

            //shopのid取得
            $id = $request->route()->parameter('shop');
            //owner/shops/indexにアクセスした場合nullなので判定
           //idがnullでなかったら、
            if(!is_null($id)){
            //shopのidからowner_idを取得する
            $shopsOwnerId = Shop::findOrFail($id)->owner->id;
              //キャスト 文字列→数値に型変換
              $shopId = (int)$shopsOwnerId;
              $ownerId = Auth::id();
              // 同じでなかったら404を返す
              if($shopId !== $ownerId){
              //abortで404画面表示
              abort(404);
              }
            }
            return $next($request);
        });
    }