如何在Laravel中为1条路由分配2个或更多用户角色?

时间:2019-04-20 11:54:23

标签: laravel authentication roles user-roles laravel-authentication

对于具有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 用户角色登录时,可以访问此页面。 而且,当我使用编辑器登录时,无法访问该页面。

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

我该怎么做?

2 个答案:

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

您可以看到,我同时检查了“作者”和“管理员”,因为“管理员”大于作者。