如何将 2 个或更多用户角色分配给 Laravel 中的 1 个路由?
How Can I Assign 2 Or More User Roles To 1 One Route In Laravel?
我有用户 table,其用户角色的列角色具有 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 登录时无法访问此页面。
我也用过中间件组。而且看起来和以前一样。
我该怎么做?
在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
这样的库
我想角色的层次结构是这样的,'Admin' -> 'author' -> 'editor'。
如果是以上情况再说,
- 管理员和作者可以看到,编辑可以看到,
- 管理员可以看到所有,
- editor只能看到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);
}
如您所见,我检查了 'author' 和 'Admin',因为 'Admin' 大于作者。
我有用户 table,其用户角色的列角色具有 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 登录时无法访问此页面。
我也用过中间件组。而且看起来和以前一样。
我该怎么做?
在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
这样的库我想角色的层次结构是这样的,'Admin' -> 'author' -> 'editor'。
如果是以上情况再说,
- 管理员和作者可以看到,编辑可以看到,
- 管理员可以看到所有,
- editor只能看到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);
}
如您所见,我检查了 'author' 和 'Admin',因为 'Admin' 大于作者。