我有3个角色,管理员,导师和学生。我想将它们放在3个不同的goups中,但我希望管理员能够在所有组中。我尝试过不同的方法将管理员添加到其他路由,但它不起作用。如何让管理员使用导师中间件中的所有路由?这是我的代码
AdminMiddleware,与其他所有类似
class AdminMiddleware
{
public function handle($request, Closure $next)
{
if(Auth::check() && Auth::user()->isRole()=="admin") {
return $next($request);
}
return redirect('login');
}
}
routesmiddleware - 在web.php中
Route::group(['middleware'=>['auth'=>'admin']], function (){
//admin routes
}
Route::group(['middleware'=>['auth'=>'tutor']], function (){
//tutor routes
}
在Kernel.php中
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'tutor' => \App\Http\Middleware\TutorMiddleware::class,
'student' => \App\Http\Middleware\StudentMiddleware::class,
在用户模型中
public function isRole(){
return $this->role;
}
你可以做的是定义一个中间件,它将支持的角色作为参数:
class HasRoleMiddleware
{
public function handle($request, Closure $next, ...$roles)
{
if(Auth::check() && in_array(Auth::user()->getRole(), $roles)) {
return $next($request);
}
return redirect('login');
}
}
这个中间件期望User::getRole()
将角色作为字符串返回,即admin
或tutor
。然后你需要像你已经完成的那样在Kernel.php
中定义中间件:
'any_role' => \App\Http\Middleware\HasRoleMiddleware::class,
最后你可以像这样使用中间件:
Route::group(['middleware' => 'auth'], function () {
Route::group(['middleware' => 'any_role:admin'], function () {
// admin routes
}
Route::group(['middleware' => 'any_role:admin,tutor'], function () {
// tutor routes
}
}
正如您所看到的,我还嵌套了在另一个检查身份验证的路由组中执行角色检查的路由组。这使其更具可读性,并降低您在未来的路由扩展中忘记身份验证检查的风险。