如何在 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']);
我想要的是,只有 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 用户角色登录时,可以访问此页面。 当我使用 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 管理)中的其他角色分配用户列表权限?