Laravel 5.2のMultiAuthでユーザーテーブルが切り替わらない

投稿者: Anonymous

Laravel 5.2 で新しく追加された MultiAuth を使って User と AdminUser の2種類のログイン機能を実装しようとしています。
テーブルはそれぞれ users と admin_users で、User 関連はすべてデフォルトの php artisan make:auth で作られた認証をそのまま利用しています。
AdminUser 側はほとんどが User 関連のコピーとなっています。

一通り組み上げてテストしたところ、User は問題なく動作していますが、 AdminUser 側でログインしようとすると「These credentials do not match our records.」となってログインできません。
SQL を確認してみると

select * from `users` where `email` = '[email protected]' limit 1

となっており、User 用のテーブルから select しようとしてしまっているためユーザーを見つけることができなくなっているようです。

正常に動作させるには

select * from `admin_users` where `email` = '[email protected]' limit 1

となっていなければなりません。

config/auth.php は次のとおりです(部分)

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'web_admin' => [
        'driver' => 'session',
        'provider' => 'admin_users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],

],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => AppUser::class,
    ],

    'admin_users' => [
        'driver' => 'eloquent',
        'model' => AppAdminUser::class,
    ],
],

routes.php はこのようになっています。

Route::group(['middleware' => 'web'], function () {

    Route::group(['middleware' => 'guest:web_admin'], function () {
        Route::get('admin/login', '[email protected]');
        Route::post('admin/login', '[email protected]');
        Route::get('admin/logout', '[email protected]');
    });
    Route::group(['middleware' => 'auth:web_admin'], function () {
        Route::get('/admin/home','[email protected]');
    });
    Route::auth();
    Route::get('/home', '[email protected]');
});

ビュー周りはデフォルトの auth のコピーで、POST先だけ admin/login となるように書き換えています。コントローラーも AuthController をコピーした AdminAuthController を使っています。修正点は $redirectTo と $loginView のみです。

User の認証には users テーブルを使い、AdminUsers の認証には admin_users テーブルを使うようにするには何が足りないのでしょうか?

解決

guardを明示しないと、config/auth.phpにて、defaultで指定されたguardが利用されるようです(標準ではusers)。

なので、guardを指定する必要があると思います。
指定の方法はいくつかありますが、AuthControllerをコピーしたということであれば、Controllerの先頭で、

classs AdminAuthController
{
protected $guard = ‘admin_users’;
}

としてみるといいのではないでしょうか。

ミドルウエアなら、

Route::group([‘middleware’ => ‘guest:admin_users’])
{
}

などとします。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *