22285


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

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

[code]

    select * from `users` where `email` = 'admin@example.com' limit 1
    
[/code]

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

正常に動作させるには

[code]

    select * from `admin_users` where `email` = 'admin@example.com' limit 1
    
[/code]

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

config/auth.php は次のとおりです（部分）

[code]

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'web_admin' => [
            'driver' => 'session',
            'provider' => 'admin_users',
        ],
    
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    
    ],
    
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    
        'admin_users' => [
            'driver' => 'eloquent',
            'model' => App\AdminUser::class,
        ],
    ],
    
[/code]

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

[code]

    Route::group(['middleware' => 'web'], function () {
    
        Route::group(['middleware' => 'guest:web_admin'], function () {
            Route::get('admin/login', 'AdminAuth\AdminAuthController@showLoginForm');
            Route::post('admin/login', 'AdminAuth\AdminAuthController@login');
            Route::get('admin/logout', 'AdminAuth\AdminAuthController@logout');
        });
        Route::group(['middleware' => 'auth:web_admin'], function () {
            Route::get('/admin/home','AdminHomeController@index');
        });
        Route::auth();
        Route::get('/home', 'HomeController@index');
    });
    
[/code]

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

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


CC BY-SA 3.0
2016-02-19T10:23:43.517
22270
2016-02-19T20:47:13.957
10083
question
php laravel
Laravel 5.2のMultiAuthでユーザーテーブルが切り替わらない


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

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

classs AdminAuthController  
{  
protected $guard = 'admin_users';  
}

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

ミドルウエアなら、

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

などとします。


CC BY-SA 3.0
2016-02-19T20:47:13.957
22285
2016-02-19T20:47:13.957
14475
22270
answer