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

Posted

技术标签:

【中文标题】如何在 Laravel 中为 1 个路由分配 2 个或多个用户角色?【英文标题】:How Can I Assign 2 Or More User Roles To 1 One Route In Laravel? 【发布时间】: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 登录时,无法访问此页面。

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

我该怎么做?

【问题讨论】:

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

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

【讨论】:

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

如何在 CodeIgniter 中为 Laravel 中的第一个项目定义子域路由?

如何在 laravel 中为两种不同的控制器功能方法使用相同的路由

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

如何在 Sentry 中为 Laravel 应用程序使用权限

在 Laravel 中为资源控制器添加新方法

如何将中间件分配给 Laravel 中的路由(更好的方法)? [关闭]