检查 laravel 中是否有任何中间件授予访问权限

Check if any middleware grant access in laravel

我有两种类型的用户角色。管理员和经理。管理员可以访问所有路由,但经理只能访问其中的一些路由。我的大部分路线都是资源路线。目前我有这个管理员路由组:

Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
    Route::resource('post','PostController')
}

这是我的'admin'中间件,如果你需要检查:

if (!Auth::user()->isAdmin())
    {
        return redirect('/home');
    }
    return $next($request);

在这里,管理员可以访问所有路由。但我想允许经理访问某些路线,例如 post.index, post.show, post.edit 。 我现在该怎么办?

下面我用例子详细解释我的问题

我有三个中间件,auth, manager, admin。顾名思义,auth 中间件检查用户是否经过身份验证,manager 中间件检查用户是否是管理员,当然 admin 中间件检查用户是否是管理员。 现在,对于 Route::resource('post','PostController') 路线,

Laravel 允许在您的控制器中使用多个路由

按照以下步骤操作:

从路由组中删除 'admin' 中间件,只留下 'auth'.

    Route::middleware(['auth'])->prefix('admin')->group(function()
    {
        Route::resource('post','PostController');
    }

现在在你的 'manager.php' 路由文件中,你可以使用并指向相同的 PostController

Route::middleware(['auth'])->prefix('manager')->group(function()
{
    Route::resource('post','PostController');
}

然后在 PostController 的顶部添加一个 __construct() 方法,像这样

class PostController extends Controller
{
    public function __construct()
    {
        $this->middleware('admin')->except(['index', 'show', 'edit']);
        $this->middleware('manager');
    }
}

您可以定义部分资源路由

https://laravel.com/docs/7.x/controllers#restful-partial-resource-routes

因此您可以在您的中间件组中定义其中的一些,而在中间件组之外定义其他的。

Route::middleware(['auth'])->group(function(){
 Route::middleware(['admin'])->prefix('admin')->group(function () {
    Route::resource('post','PostController')->except([
    'index', 'show', 'edit'
     ]);
 }
 Route::middleware(['manager'])->prefix('manager')->group(function () {
  Route::resource('post','PostController')->only([
    'index', 'show', 'edit'
  ]);
 }
}