0

我有用户角色列角色的用户表,用户角色具有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');

但是当我用管理员用户登录时,它说你可以用作者用户访问这个页面。

当我使用作者用户登录时,它说您可以使用管理员用户访问此页面。

我希望当我以管理员作者用户角色登录时,可以访问此页面。当我使用编辑器登录时无法访问此页面。

我也使用过中间件组。它看起来像以前一样。

我怎样才能做到这一点 ?

4

2 回答 2

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 并将其分配给两个角色。您将需要自己实现或使用这样的

于 2019-04-20T12:02:37.740 回答
1

我想角色的层次结构是这样的,'Admin' -> 'author' -> 'editor'。

如果是上述情况,然后说,

  • admin 和 author 可以看到 editor 可以看到的内容,
  • 管理员可以看到所有,
  • 编辑只能看到编辑的,
  • 作者可以看到属于自己和编辑的东西

那么您的作者中间件的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);
}

如您所见,我检查了“作者”和“管理员”,因为“管理员”大于作者。

于 2019-04-20T12:06:32.270 回答