对于具有Enum
值的用户角色,我有一个具有列角色的用户表:
迁移
$table->enum('role', ['Admin','author','editor']);
我想要的是,只有 Admin 和 author 用户可以访问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 用户身份登录时,它说您可以与 author 用户一起访问此页面。
当我以 author 用户身份登录时,它说您可以用 admin 用户访问此页面。
我希望以 Admin 或 author 用户角色登录时,可以访问此页面。 而且,当我使用编辑器登录时,无法访问该页面。
我也使用过中间件组。看起来像以前一样。
我该怎么做?
答案 0 :(得分:1)
当您在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
的库答案 1 :(得分:1)
我想角色的层次结构按此顺序排列,即“管理员”->“作者”->“编辑”。
如果是上述情况,然后说
然后您的 author 中间件的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);
}
您可以看到,我同时检查了“作者”和“管理员”,因为“管理员”大于作者。