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コントローラーでしかきかないミドルウェアを作ることができる。
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); }); }