У меня есть группа маршрутов с разными маршрутами. Я хочу иметь доступ к разным уровням ролей без изменения URL-адреса приложения.
Например, я хочу использовать / admin в качестве маршрута, а затем я хочу разрешить или запретить пользователям в зависимости от их ролей. По сути, я хочу, чтобы каждый пользователь мог видеть одну и ту же страницу, но с разными параметрами меню (я знаю, как это сделать), но также защищал ссылки от прямого доступа.
Есть ли хороший способ добиться этого? без необходимости использования разных промежуточных программ на каждом маршруте? Поскольку, похоже, нет способа получить переменную $ request внутри файла web. php, а только внутри контроллера. Я использую пакет sentinel для аутентификации.
Пример кода моего веб-сайта. php:
Route::group(
['prefix' => 'admin', 'middleware' => 'customer', 'as' => 'admin.'],
function () {
// Ad list
Route::get('getMyAnnonsList', 'Admin\BackEndController@getMyAdList')->name('getMyAdList');
}
);
Отличный ответ от @lagbox. Это то, что я в итоге сделал. Очень элегантно.
web. php:
Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () {
Route::middleware('admin:admin,user')->group(function(){
Route::get('getMyAnnonsList', 'Admin\BackEndController@getMyAdList')->name('getMyAdList');
});
});
промежуточное ПО:
public function handle($request, Closure $next, ...$roles)
{
if (!Sentinel::check())
return redirect('admin/signin')->with('info', 'You must be logged in!');
foreach($roles as $role)
if($role == Sentinel::getUser()->roles[0]->slug)
return $next($request);
return redirect()->back();
}