我为3个中间件分配了所有不同的路由。这些是与每种用户类型相对应的路由。
像这样:
在我的路线上,我有这个
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 () {});
从让两者共享这些路线的意义上说,什么都没有。我该怎么办?
答案 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('/');
}
}
我不知道您如何检查用户以查看他们具有什么“角色”,但这将在此中间件中发挥作用。