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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Laravel中将2个或更多用户角色分配给1个路由?相关的知识,希望对你有一定的参考价值。

我的用户表具有列角色,用于具有Enum值的用户角色:

移民

$table->enum('role', ['Admin','author','editor']);

我想要的是,只有管理员和作者用户可以访问site.com/view/problems这个页面。

我在apphttpMiddleware上用这个内容创建了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' =>AppHttpMiddlewareAdminMiddleware::class,
        'author' =>AppHttpMiddlewareauthorAdminMiddleware::class,
        'editor' =>AppHttpMiddlewareeditorAdminMiddleware::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这样的库

另一答案

我认为角色的层次结构按此顺序排列,“管理员” - >“作者” - >“编辑器”。

如果是上述情况然后说,

  • admin和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);
}

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

以上是关于如何在Laravel中将2个或更多用户角色分配给1个路由?的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中将第一个循环分配给第二个循环等等?

如何使用 laravel 8 +jetstream + spatie 为注册用户分配角色

在扩展的 Asp.Net Identity 2 错误中将角色分配给用户违反 PRIMARY KEY 约束“PK_dbo.AspNetUserRoles”

如何在注册期间为用户分配角色? (委托)(Laravel 5.1)

在 PHP 中将 2 个或更多 png 图像合并到基本图像上

Laravel 5.4 如何通过表单请求为用户分配角色?