Как назначить два промежуточных программного обеспечения для одной и той же группы маршрутов. Laravel - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть 3 Middleware со всеми назначенными маршрутами. Это маршруты, которые соответствуют каждому типу пользователя.

Например:

enter image description here

В моих маршрутах у меня есть

Route::group(['middleware' => 'auth'], function () {
    Route::resource('/', 'DashController');
    Route::get('/logout')->name('logout')->uses('Auth\LoginController@logout');

    Route::group(['middleware' => ['director']], function () {
        //survey
        //questions
        //groups
        //forum
    });

    Route::group(['middleware' => ['super']], function () {
        //import
    });

    Route::group(['middleware' => ['admin']], function () {
        //semester
        //users
        //sections
        //category
        //classrooms
        //careers
        //courses
    });

});

Что мне нужно сделать, это добавить маршруты, которые находятся внутри группы директоров, также в группу администраторов. Промежуточное ПО администратора проверяет, является ли пользователь администратором или суперадмином, поэтому у супергруппы есть только маршрут импорта.

Я пытался вложить группу одну в другую, как это:

Route::group(['middleware' => ['director', 'admin']], function () {
        //survey
        //questions
        //groups
        //forum
    Route::group(['middleware' => ['admin']], function () {
        //semester
        //users
        //sections
        //category
        //classrooms
        //careers
        //courses
    });
});

Я также пытался сделать то же, что и выше, но первая группа, как эта

Route::group(['middleware' => ['director'], ['admin']], function () {});

Ничего не работает, в смысле, позволяя обоим разделить эти маршруты. Как я могу это сделать?

1 Ответ

0 голосов
/ 06 ноября 2019

Вот способ использования этой каскадной установки:

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

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('/');
    }
}

Я не знаю, как вы проверяете пользователя, чтобы увидеть, какую «роль» он играет, но это вступит в игру в этомпромежуточное программное обеспечение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...