【问题标题】:How Can I Assign 2 Or More User Roles To 1 One Route In Laravel?如何在 Laravel 中为 1 个路由分配 2 个或多个用户角色?
【发布时间】:2019-09-10 09:34:09
【问题描述】:

我有一个用户表,其中包含Enum 值的用户角色的列角色:

迁移

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

我想要的是,只有 Adminauthor 用户可以访问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 用户访问此页面。

我希望当我以 Adminauthor 用户角色登录时,可以访问此页面。 当我使用 editor 登录时,无法访问此页面。

我也使用过中间件组。和以前一样。

我该怎么做?

【问题讨论】:

  • 如果我可以问,您的意思是管理员不能访问编辑器吗?
  • @Namoshek 不,先生,这不是重复的,请注意我的问题和答案并与该问题和答案进行比较
  • 显然是,请参阅参考答案。那里的解决方案可以处理多个角色。
  • 我的问题通过@BharatGeleda 解决方案解决了你告诉的链接,它有 getRole() 我不知道那是什么,我该如何定义它!但在这个答案上,在堆栈和谷歌上搜索数小时后,很清楚并解决了我的问题

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


【解决方案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这样的库

【讨论】:

  • 你的代码没有被唤醒,我应该测试 laravel 权限
  • 我错误地使用了Author 而不是author。你可以试试这个。我和@oluwatobi 提到的一般想法是相同的,如果正确实施,应该可以工作。
  • 是的,您的解决方案有效,对不起,我的错误是在 kernel.php 上实现了这个新的中间件,另一个问题是如果我想访问编辑角色的页面,我应该定义新的中间件是吗?
  • 如果需要重复,我会说看看 laravel-permission 库。拥有角色和权限会更好,以后更容易修改。
  • 你有什么帮助(视频或文档)如何使用 laravel-permission 包吗?
【解决方案2】:

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

如果是上面的话,那就说吧,

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

那么你的 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);
}

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

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2015-06-27
    • 2016-02-05
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多