php-間違ったデータベースを使用しているLaravel認証ミドルウェア
config/database.php
には、 mysql
とwebsite
の2つの接続があります。どちらも同じホストに接続しますが、データベースだけが異なります。デフォルトは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
ミドルウェアが魔法をかける前に認証ミドルウェアが「作成」されたことを意味します。これを修正する方法について何か提案はありますか?
答え :
解決策:
おっと!この回避策を見つけました。私の質問で言ったように、認証ミドルウェアは自分のミドルウェアよりも前にセットアップされているようです。その結果、認証ミドルウェアは起動時に既知のデフォルト接続である mysql
を使用します。 。そこで、認証ミドルウェアを AwesomeAuthMiddleware
のような新しいミドルウェアにコピーして貼り付け、代わりにそれを使用することにしました。うまくいきました!
答え :
解決策:
これを見つけた他の人たちのために、私はLaravelPassportとマルチテナンシーで同じ問題に遭遇しました。一般的なデータベースもあり、テナントごとに別のデータベースがあります。上記の認証ミドルウェアをコピーするよりも簡単な解決策があります。 Laravelのミドルウェアの優先順位を使用するだけです。
Kernel.php
には、プロパティ $middlewarePriority
があり、Laravelの認証ミドルウェアの前にデータベース変更ミドルウェアを追加するだけです。 。
/ **
*ミドルウェアの優先順位でソートされたリスト。
*
*これにより、非グローバルミドルウェアは常に指定された順序になります。
*
*@var配列
* /
保護された{-コード-2}=[
\ Illuminate \ Session \ Middleware \ StartSession :: class、
\ Illuminate \ View \ Middleware \ ShareErrorsFromSession :: class、
// AUTHミドルウェアを実行する前に、常に最初にDBに接続します
\ App \ Http \ Middleware \ ConnectToDatabase :: class、
\ App \ Http \ Middleware \ Authenticate :: class、
\ Illuminate \ Session \ Middleware \ AuthenticateSession :: class、
\ Illuminate \ Routing \ Middleware \ SubstituteBindings :: class、
\ Illuminate \ Auth \ Middleware \ Authorization :: class、
];
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。