【问题标题】:Laravel auth middleware using wrong databaseLaravel auth 中间件使用错误的数据库
【发布时间】:2017-04-24 00:21:31
【问题描述】:

config/database.php 我有两个连接:mysqlwebsite。两者都连接到同一台主机,只是数据库不同。默认为mysql

我创建了一个名为SetupWebsite 的中间件,它检查传入域是否存在于默认连接中的数据库中。如果是这样,它将使用以下代码使用正确的数据库填充website 连接:

config(['database.connections.website.database' => $database]);

然后,它将默认连接切换到website

config(['database.default' => 'website']);

我通过从数据库中检索一个仅存在于website 连接中的值来验证默认连接现在是website。我还可以登录到website 连接中的用户帐户。现在,当我设置以下路线时:

Route::get('admin', function () {
    return 'Welcome to the dashboard!';
})->middleware('auth');

我在成功登录后去那里,我收到“tbl_users 不存在”的错误消息,我看到它使用mysql 连接来检查用户是否经过身份验证。我想不出如何告诉 Laravel 我正在使用另一个数据库连接。 FIY:我没有缓存配置。

更新

当我将以下代码添加到Illuminate\Auth\Middleware\Authenticate::class的构造函数中时:

DB::setDefaultConnection('website');

我收到未选择数据库的错误消息,这意味着在我的 SetupWebsite 中间件发挥作用之前“创建”了身份验证中间件。有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: php laravel laravel-middleware


    【解决方案1】:

    哎呀!我找到了解决方法。就像我在我的问题中所说的那样,看起来 auth 中间件是在我自己的中间件之前设置的,这导致 auth 中间件使用启动时已知的默认连接,即mysql。因此,我决定将 auth 中间件复制粘贴到一个名为 AwesomeAuthMiddleware 的新中间件中,然后改用该中间件。成功了!

    【讨论】:

      【解决方案2】:

      对于其他发现此问题的人,我在使用 Laravel Passport 和多租户时遇到了同样的问题。我也有一个通用数据库,每个租户都有另一个数据库。有一个比复制上面的 auth 中间件更简单的解决方案。只需使用 Laravel 的中间件优先级即可。

      Kernel.php 中,你有$middlewarePriority 的属性,只需在Laravel 的身份验证中间件之前添加你的数据库更改中间件即可。

      /**
       * The priority-sorted list of middleware.
       *
       * This forces non-global middleware to always be in the given order.
       *
       * @var array
       */
      protected $middlewarePriority = [
          \Illuminate\Session\Middleware\StartSession::class,
          \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      
          // Always connect to the DB first, before executing AUTH middleware
          \App\Http\Middleware\ConnectToDatabase::class,
      
          \App\Http\Middleware\Authenticate::class,
          \Illuminate\Session\Middleware\AuthenticateSession::class,
          \Illuminate\Routing\Middleware\SubstituteBindings::class,
          \Illuminate\Auth\Middleware\Authorize::class,
      ];
      

      【讨论】:

        猜你喜欢
        • 2015-11-16
        • 1970-01-01
        • 2021-09-24
        • 2015-09-25
        • 2021-09-11
        • 2015-10-07
        • 1970-01-01
        • 2018-03-26
        • 2016-11-28
        相关资源
        最近更新 更多