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

如何在Laravel中将2个或多个用户角色分配给1个路由?,laravel,authentication,roles,user-roles,laravel-authentication,Laravel,Authentication,Roles,User Roles,Laravel Authentication,对于具有Enum值的用户角色,我有一个具有列角色的用户表: 迁移 $table->enum('role',['Admin','author','editor']); 我想要的是,只有管理员和作者用户可以访问site.com/view/problems此页面 我已经使用此内容在\app\http\Middleware上创建了3个中间件 公共函数句柄($request,Closure$next) { 如果($request->user()&&$request->user()->role!=“Adm

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

迁移

$table->enum('role',['Admin','author','editor']);
我想要的是,只有管理员作者用户可以访问
site.com/view/problems
此页面

我已经使用此内容在
\app\http\Middleware
上创建了3个中间件

公共函数句柄($request,Closure$next)
{
如果($request->user()&&$request->user()->role!=“Admin”){
返回新的响应(查看('unauthorized')->带有('role','Admin');
}
返回$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中使用它们,如下所示

路由::get('/view/problems',函数(){ // })->中间件('Admin','editor'); 但是当我用管理员用户登录时,它说你可以用作者用户访问这个页面

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

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

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


如何才能做到这一点?

当在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并将其分配给两个角色。您需要自己实现,或者使用类似于

的库。当您在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并将其分配给两个角色。您将需要自己实现这一点,或者使用类似于

的库。我想角色的层次结构是这样的,“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);
}

如您所见,我同时选中了“author”和“Admin”,因为“Admin”大于“author”。

我想角色的层次结构是这样的,“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);
}

正如您所见,我同时检查了“author”和“Admin”,因为“Admin”大于“author”。

如果我可以问,您的意思是管理员无法访问编辑器吗?可能是@Namoshek的重复项不,先生,这不是重复项,请注意我的问题和答案,并与该问题和答案进行比较,请参阅参考答案。那里的解决方案处理多个角色。我的问题用@BharatGeleda解决方案解决了。你告诉我的链接是,它有getRole(),我不知道那是什么,我如何定义它!但在这个答案上,在stack和Google上搜索数小时后,我的问题就很清楚了。如果我可以问,你的意思是管理员不能访问编辑器吗?可能是@Namoshek的副本不,先生,这不是副本。请注意我的问题和答案,并与该问题和答案进行比较。很清楚,请参阅参考答案。那里的解决方案处理多个角色。我的问题用@BharatGeleda解决方案解决了。你告诉我的链接是,它有getRole(),我不知道那是什么,我如何定义它!但在这个答案上,我的问题很清楚,在搜索stack和Google几个小时后就解决了。如果你的代码没有工作,我应该测试一下laravel permissonI错误地使用了
作者而不是
作者
。你可以试试这个。我和@oluwatobi提到的总体想法是相同的,如果正确实现,应该可以工作。是的,您的解决方案工作了,对不起,我的错误是在kernel.php上实现了这个新的middlware,另一个问题是,如果我想访问编辑器角色的页面,我应该定义新的中间件是吗?如果这是一个重复的要求,我想说看看拉威尔许可图书馆。拥有角色和权限以后会更好,更容易修改。您有关于如何使用laravel权限包的帮助(视频或文档)吗?您的代码没有运行,我应该测试laravel permissonI,因为我错误地使用了
作者
,而不是
作者
。你可以试试这个。我和@oluwatobi提到的总体思路是相同的,如果正确实施,应该可以工作