如何在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提到的总体思路是相同的,如果正确实施,应该可以工作