如何将两个中间件分配给同一组路由。拉拉韦尔

时间:2019-11-06 18:46:04

标签: laravel

我为3个中间件分配了所有不同的路由。这些是与每种用户类型相对应的路由。

像这样:

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
    });

});

我需要做的是将Director组中的路由也添加到admin组中。管理员中间件检查用户是管理员还是超级管理员,因此这就是为什么超级组仅具有导入路由的原因。

我试图像这样将组嵌套在另一个内部:

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 :(得分:0)

这是一种使用级联设置的方法:

必须从最高角色到最低角色来反过来考虑这一点,因为这里有一个权限渠道,顶层可以访问所有内容,下一层几乎可以访问所有内容,而下层则可以访问最少的内容。

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

我不知道您如何检查用户以查看他们具有什么“角色”,但这将在此中间件中发挥作用。