90052


こちらのサイトを参考にマルチ認証を実現しようとしています。  
[Laravel Breezeでマルチ認証(Multi
Authentification)の徹底解説](https://reffect.co.jp/laravel/breeze_multi_auth)

user,adminの２つの認証を作成しています。登録までは問題なく処理できました。  
しかし、user,adminの情報でログインをしようしても、常にusersテーブルを参照してしまいます。  
adminでログインすることが出来ません（adminのログイン画面でも）を

この原因は何が考えられるでしょうか？

【追記】  
`config\auth.php` の `'guards' => ['web' => [` の `'provider' => 'users',` を
`'provider' => 'admins',` に変えたところ、adminでログインできました（adminでしかログインできない）  
ただ、この設定がどこに影響しているのか掴みきれていません

【追記】  
`config\auth.php` の `'guards' => ['web' => [` を `'aaa' => [` に変えたところ  
`InvalidArgumentException Auth guard [web] is not defined.`  
エラーが発生しました。webは必須なんでしょうか？

[code]

    // config/auth.php　一部
        'guards' => [
            'web' => [
                'driver' => 'session',
                'provider' => 'users',
            ],
            'admin' => [
                'driver' => 'session',
                'provider' => 'admins',
            ],
        ],
        'providers' => [
            'users' => [
                'driver' => 'eloquent',
                'model' => App\Models\User::class,
            ],
            'admins' => [
                'driver' => 'eloquent',
                'model' => App\Models\admin::class,
            ],
    
    
[/code]

[code]

    // app\Http\Requests\Auth\LoginRequest.php　一部
        public function authenticate()
        {
            $this->ensureIsNotRateLimited();
    
            $this->is('admin/*') ? $guard = 'admin' : $guard = 'web';
    
            if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
                RateLimiter::hit($this->throttleKey());
    
                throw ValidationException::withMessages([
                    'email' => trans('auth.failed'),
                ]);
            }
    
            RateLimiter::clear($this->throttleKey());
        }
    
[/code]

[code]

    // app\Http\Middleware\Authenticate.php　一部
        protected function redirectTo($request)
        {
            if (! $request->expectsJson()) {
                if($request->is('admin/*')){
                    return route('admin.login');
                }
                return route('login');
            }
        }
    }
    
[/code]

[code]

    // routes\admin.php　一部
        Route::get('login', [AuthenticatedSessionController::class, 'create'])
            ->middleware('guest:admin')
                    ->name('login');
    
        Route::post('login', [AuthenticatedSessionController::class, 'store'])
            ->middleware('guest:admin');
    
[/code]


CC BY-SA 4.0
2022-07-17T18:03:35.293
90046
2022-07-18T02:45:16.853
2022-07-18T02:45:16.853
7980
7980
question
laravel
Laravel9+Breeze のマルチ認証で、認証時に違うテーブルを参照してしまう（ログインできない）


やろうとしている方法は正しいです。  
あとはコード上のちょっとしたミスを修正すれば動作しそうですね。  
<https://readouble.com/laravel/9.x/ja/authentication.html#accessing-specific-
guard-instances>

[code]

    $this->is('admin/*') ? $guard = 'admin' : $guard = 'web';
    
[/code]

せっかくここでガードを切り替えているので、

[code]

    Auth::attempt(...)
    
[/code]

この部分を

[code]

    Auth::guard($guard)->attempt(...)
    
[/code]

このようにすれば意図通りの動作になると思います。

せっかくなのでもう少し深堀りすると、

> config\auth.php の 'web' => [ を 'aaa' => [ に変えたところ  
>  InvalidArgumentException Auth guard [web] is not defined.  
>  エラーが発生しました。webは必須なんでしょうか？

必ずしも必須ではありませんが、もう少し上の方に `'defaults'` という設定がありそこで `'web'` が指定されていないでしょうか？この設定が
`guard()` を指定しなかった場合のデフォルトの認証先です。現在のコードだと `guard()`
は指定せずデフォルトで認証するようにしている（しかしデフォルトの `web` が無い）のでエラー、といいう順序ですね。

> config\auth.php の 'provider' => 'users', を 'provider' => 'admins', に変えた>
> ところ、adminでログインできました（adminでしかログインできない）  
>  ただ、この設定がどこに影響しているのか掴みきれていません

`guards.*.provider`の設定が `providers.*` に定義されている、という関係です。  
つまり上の設定変更は「ガード『web』のプロバイダ設定を『admins』」に変更」ですが、それは「ガード『admin』と同様の設定なので、ご覧の通り「adminでしかログインできない」となったわけです。


CC BY-SA 4.0
2022-07-18T00:34:12.080
90052
2022-07-18T00:34:12.080
53573
90046
answer