Динамическая защита маршрутов на основе идентификатора (laravel, сводная таблица)

Эта тема много обсуждалась здесь, но я не понимаю.

Я хотел бы защитить свои маршруты с помощью сводных таблиц (user_customer_relation, user_object_relation (…)), но я не понимаю, как правильно применить фильтр.

Route::get('customer/{id}', 'CustomerController@getCustomer')->before('customer')

Теперь я могу добавить некоторые значения в фильтр до

->before('customer:2')

Как я могу сделать это динамически?

В фильтре я могу сделать что-то вроде:

if(!User::hasAccessToCustomer($id)) {
App::abort(403);
}

В функции hasAccessToCustomer:

public function hasCustomer($id) {
if(in_array($id, $this->customers->lists('id'))) {
return true;
}

return false;
}

Как правильно передать идентификатор клиента в фильтр?

0

Решение

Вы не можете передать параметр маршрута в фильтр. Однако вы можете получить доступ к параметрам маршрута практически из любого места в приложении, используя Route::input():

$id = Route::input('id');

Оптимизации

public function hasCustomer($id) {
if($this->customers()->find($id)){
return true;
}

return false;
}

Или на самом деле даже

public function hasCustomer($id) {
return !! $this->customers()->find($id)
}

(Двойной !! бросит null / Customer результат как логическое)

Общий подход

Вот возможный, более общий подход к проблеме: (Хотя это не проверено)

Route::filter('id_in_related', function($route, $request, $relationName){
$user = Auth::user();
if(!$user->{$relationName}()->find($route->parameter('id')){
App::abort(403);
}
});

А вот как вы бы это использовали:

->before('id_in_related:customers')
->before('id_in_related:objects')
// and so on
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]