【问题标题】:more than one guard in route路线中不止一名守卫
【发布时间】:2017-01-15 03:00:05
【问题描述】:

我使用 laravel 框架我想在我的路线中使用多个警卫,例如:

   Route::group([ 'middleware' => 'jwt.auth', 'guard' => ['biker','customer','operator']], function () {}

我在AuthServiceProvider.php 中有一个脚本,如下所示:

  $this->app['router']->matched(function (\Illuminate\Routing\Events\RouteMatched $event) {
        $route = $event->route;
        if (!array_has($route->getAction(), 'guard')) {
            return;
        }
        $routeGuard = array_get($route->getAction(), 'guard');
        $this->app['auth']->resolveUsersUsing(function ($guard = null) use ($routeGuard) {
            return $this->app['auth']->guard($routeGuard)->user();
        });
        $this->app['auth']->setDefaultDriver($routeGuard);
    });

只有一名守卫在路线上工作,例如'guard'=>'biker'
那么如何更改 AuthServiceProvider.php 中的代码以在路由中使用多个 gaurd

【问题讨论】:

  • 我不认为 Laravel 允许在一条路线上有多个守卫。您可能需要基于此重新考虑您的策略(即单一保护并通过中间件实现此功能)
  • 因为我的auth.php 中有 3 个保护,而 laravel 无法将多保护设置为默认值,并且当我使用 jwt 运行 api 来解析该令牌以了解请求的用户类型时,我会看到 @ 987654326@,因为是3个模型的用户,我不知道如何处理多个模型的用户
  • 问题是你正在做的不是标准的事情,所以 Laravel 不能开箱即用地处理它,这就是为什么我建议你切换到标准的做事方式事物,即单用户模型、单警卫和通过中间件进行的不同用户类型检查。否则,您基本上必须重写您自己的自定义身份验证驱动程序和守卫。

标签: php laravel laravel-5.2 laravel-routing


【解决方案1】:

我知道这是一个老问题,但我刚刚经历了这个问题并想出了如何自己解决它。这可能对其他人有用。解决方案很简单,你只需要在中间件名称后面指定每个守卫,用逗号分隔,如下所示:

Route::group(['middleware' => ['auth:biker,customer,operator'], function() {
    // ...
});

然后将守卫发送到\Illuminate\Auth\Middleware\Authenticate 函数authenticate(array $guards),该函数会检查数组中提供的每个守卫。

这适用于 Laravel 5.4。 也适用于 Laravel 6.0。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2013-03-31
    • 2018-11-14
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多