Laravel auth中间件使用错误的数据库

时间:2016-12-08 17:00:54

标签: php laravel laravel-middleware

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中间件发挥其魔力之前,'创建'了auth中间件。有什么建议我可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

对于其他人来说,我在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,
];