我的用户表具有列角色,用于具有Enum
值的用户角色:
移民
$table->enum('role', ['Admin','author','editor']);
我想要的是,只有管理员和作者用户可以访问site.com/view/problems
这个页面。
我在\app\http\Middleware
上用这个内容创建了3个中间件。
public function handle($request, Closure $next)
{
if ($request->user() && $request->user()->role != 'Admin') {
return new Response(view('unauthorized')->with('role', 'Admin'));
}
return $next($request);
}
并将它们放入Kernal.php
protected $routeMiddleware = [
'Admin' =>\App\Http\Middleware\AdminMiddleware::class,
'author' =>\App\Http\Middleware\authorAdminMiddleware::class,
'editor' =>\App\Http\Middleware\editorAdminMiddleware::class,
];
然后在web.php中使用它们
Route::get('/view/problems', function () {
//
})->middleware('Admin', 'editor');
但是当我使用管理员用户登录时,它表示您可以使用作者用户访问此页面。
当我使用作者用户登录时,它表示您可以使用admin用户访问此页面。
我希望当我使用管理员或作者用户角色登录时,可以访问此页面。当我用编辑器登录时无法访问此页面。
我也使用过中间件组。它看起来像以前。
我怎样才能做到这一点 ?
当您在middleware()函数中传入多个中间件时,它需要运行并传递所有中间件。现在,如果用户没有这两个角色,它将失败。
你可以做的一件事是定义一个新的中间件,它检查用户是作者还是编辑器并让它通过
public function handle($request, Closure $next)
{
if ($request->user() && $request->user()->role != 'Admin' && $request->user()->role != 'author') {
return new Response(view('unauthorized')->with('role', 'Admin'));
}
return $next($request);
}
您可以做的另一件事是查看权限,即为这两个角色分配特定权限。说CanViewProblemsPermission并将其分配给两个角色。您需要自己实现或使用像this这样的库
我认为角色的层次结构按此顺序排列,“管理员” - >“作者” - >“编辑器”。
如果是上述情况然后说,
那么你的作者中间件的handle()
函数可能如下所示:
public function handle($request, Closure $next)
{
if ($request->user() && in_array($request->user()->role, ['Admin','author'])) {
return new Response(view('unauthorized')->with('role', $request->user()->role));
}
return $next($request);
}
正如您所看到的,我检查了“作者”和“管理员”,因为“管理员”大于作者。