【问题标题】:Multiple middleware not working on laravel多个中间件在 laravel 上不起作用
【发布时间】:2019-09-19 05:12:59
【问题描述】:

我有一个只能通过 2 个中间件规则之一访问的路由资源组。我已经注册了它们,如果我单独测试它们,它们都可以独立工作,但是当我将它们放在一起时,它们就不起作用了

我尝试将它们都作为“或”语句运行(这意味着中间件按预期工作)但这意味着任何未登录的人也可以出于某种原因访问路由。如果我使用逗号分隔中间件,则对所有人都将其屏蔽。我知道这两个中间件都可以正常工作,因为如果我独立尝试它们,它们确实可以工作。我正在使用下面的代码

Route::group(['middleware' => ['IsAdmin' or 'IsPatreon']], function(){
Route::resource('patreon', 'patreonGalleryController', ['names'=>[

  'index'=>'patreonGallery.index',
  'create'=>'patreonGallery.create',
  'store'=>'patreonGallery.store',
  'edit'=>'patreonGallery.edit',
  'show'=>'patreonGallery.show',
  'destroy'=>'patreonGallery.destroy',
  ]]);
});

我如何设置它以便只有管理员或 patreon 用户才能看到路径?

【问题讨论】:

  • 您不能应用带有 OR 条件的中间件。如果您说两个用户都必须通过两者才能被路由。这是一种使用或/或中间件的方法(但它来自 2016 年)。 stackoverflow.com/a/38712654/3585500

标签: php laravel middleware


【解决方案1】:

你在你的控制器中做这样的事情。

  public function __construct()
{
    return ($this->middleware('IsAdmin')) || $this->middleware('IsPatreon');
}

此控制器上的每个路由都将由任何一个中间件进行身份验证。

【讨论】:

    【解决方案2】:

    您不能在中间件数组中使用or 条件。中间件数组总是返回and 条件。您可以在中间件中指定用户角色。

    【讨论】:

      【解决方案3】:

      两个中间件分别工作。 IsAdmin 正在检查用户是否为管理员 IsPatreon 正在检查用户是否是 patreon...

      OR Operator 不能合并这两个中间件

      您可能需要创建新的中间件,例如 IsAdminOrPatreon,您是否检查了该中间件的内部并将该中间件分配给您的组..

      或者你可以尝试使用中间件参数,例如

      Route::group(['middleware' => ['checkRoles:admin,patreon']], function(){
        Route::resource('patreon', 'patreonGalleryController', ['names'=>[
      
          'index'=>'patreonGallery.index',
          'create'=>'patreonGallery.create',
          'store'=>'patreonGallery.store',
          'edit'=>'patreonGallery.edit',
          'show'=>'patreonGallery.show',
          'destroy'=>'patreonGallery.destroy',
        ]]);
      });
      

      在你的checkRoles 中间件中获得adminpatreaon 这样的角色:

      public function handle($request, Closure $next) {
      
          // will contain ['role1', 'role2']
          $allowedRoles = array_slice(func_get_args(), 2);
      
          // here you can loop and check your roles
      }
      

      注意!如果你通过'checkRoles:admin,patreon'你会得到

      array(admin,patreon)
      

      如果你通过'checkRoles:admin'你会得到

      array(admin)
      

      【讨论】:

        猜你喜欢
        • 2018-10-25
        • 2018-05-11
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        相关资源
        最近更新 更多