Вот способ использования этой каскадной установки:
Нужно думать об этом в обратном порядке с наивысшей ролью, необходимой для наименьшего, поскольку у вас есть воронка разрешений здесь, где верхний может получить доступ ко всему, следующий вниз почти все, затем самый нижний.
Route::group(['roles' => 'super', 'middleware' => 'check', ...], function () {
// only routes for 'super admin'
Route::group(['roles' => 'admin', ...], function () {
// routes only for superadmin and admin
Route::group(['roles' => 'director', ...], function () {
// remaining routes that director, admin and super admin can access
Route::get('sometest', function () { })->name('for-all');
});
})
});
Мы собираемся использовать возможность каскадирования групп маршрутов с параметром / атрибутами маршрута.
Маршрут с именем for-all
закончится параметром действия с именем roles
, который будет массивом, ['super', 'admin', 'director']
. Мы можем использовать это промежуточное ПО, чтобы мы знали, что проверять.
class CheckMiddleware
{
public function handle($request, Closure $next)
{
$roles = $request->route()->getAction('roles', []);
foreach ((array) $roles as $role) {
// if the user has this role, let them pass through
if (...) {
return $next($request);
}
}
// user is not one of the matching 'roles'
return redirect('/');
}
}
Я не знаю, как вы проверяете пользователя, чтобы увидеть, какую «роль» он играет, но это вступит в игру в этомпромежуточное программное обеспечение.