Laravel запрещает пользователям редактировать / просматривать ресурсы других пользователей

В моем приложении laravel у меня есть несколько учетных записей пользователей, у которых есть ресурсы, которые им назначены. Скажем, например, «платеж». Чтобы отредактировать или просмотреть платеж, пользователь посетит маршрут /payment/edit/{payment} (где payment будет идентификатором платежа).

Хотя у меня есть фильтр auth, чтобы остановить доступ пользователей к этой странице без входа, остановить нечего, например, пользователь 1 от редактирования оплаты пользователя 2.

Есть ли фильтр, который я могу использовать пользователю, который проверяет, какой пользователь имеет платеж (или какой-либо другой ресурс), чтобы предотвратить такую ​​проблему?

[Я использую привязки модели Laravel, которые автоматически выбирают модель, указанную маршрутом, а не я получаю ее в контроллере, используя красноречивый.]

Related of "Laravel запрещает пользователям редактировать / просматривать ресурсы других пользователей"

По умолчанию такой фильтр не существует, однако его можно легко создать (в зависимости от того, как настроена ваша база данных). В приложении / filters.php вы можете сделать что-то вроде этого:

 Route::filter('restrictPermission', function($route) { $payment_id = $route->parameter('payment'); if (!Auth::user()->payments()->find($payment_id)) return Redirect::to('/'); }); 

Это сравнивает текущий зарегистрированный пользователь payment_id (в вашей базе данных) с аргументом {payment}, переданным в маршрут. Очевидно, что в зависимости от того, как настроена ваша база данных (например, если payment_id находится в отдельной таблице), вам нужно изменить условие.

Затем примените фильтр к вашему маршруту:

 Route::get('/payment/edit/{payment}', array('before' => 'restrictPermission')); 

Один из способов – разместить оператор where в каждом соответствующем запросе. Хотя это не очень красиво, это работает.

 $payment = Payment::where('user_id', '=', Auth::user()->id)->find($id); 

Также возможно использовать фильтры url, такие как seeARMS, но я думаю, что это не очень элегантно. Наиболее логичным местом для гнездования такой логики является сама модель. Одна из возможностей – использовать события модели , но это дает вам возможность перехватывать обновления, вставлять или удалять утверждения, а не выбирать. Это может измениться в будущем. Возможно, вы могли бы использовать событие boot() , но я не уверен, что это сработает.

И последнее, но не менее важное: вы можете использовать области запросов .

 class Payment extends Eloquent { public function scopeAuthuser($query) { return $query->where('user_id', '=', Auth::user()->id); } } 

и в запросах вы присоединяете область действия

 Payment::authuser()->find($id); 

Вы можете сделать это на базовой модели и перейти от нее, так что у вас есть этот метод во всех ваших соответствующих моделях.