🦔

Laravel マルチ認証で認証後は、通常、ガード名の指定は不要

2021/06/03に公開

はじめに

小ネタですが、マルチ認証で認証した後は、通常はガード名の指定は不要です。

例えば、管理者用に admins テーブルと admin ガードがあり、無事管理画面にログイン後は、その後の処理では、ガード名の指定は普通は不要です。

具体的には、

    public function index(Request $request)
    {
        // ガード名を指定した場合
        $name = auth('admin')->user()->username;

        // ガード名不要でOK
        $name = auth()->user()->username;
        $name = \Auth::user()->username;
        $name = $request->user()->username; // 本来user()の引数でガード名指定可

        // ガード名不要でOK
        auth()->logout();

といった感じです。

この理由は、Authenticate ミドルウエア(Illuminate\Auth\Middleware\Authenticate)と Illuminate\Auth\AuthManager に見る事ができます。(下記は、Laravel8の場合)

// Authenticate ミドルウエア
    protected function authenticate($request, array $guards)
    {
        if (empty($guards)) {
            $guards = [null];
        }

        foreach ($guards as $guard) {
            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard); // ★ここ
            }
        }

        $this->unauthenticated($request, $guards);
    }
// AuthManager
    public function shouldUse($name)
    {
        $name = $name ?: $this->getDefaultDriver();

        $this->setDefaultDriver($name);

        $this->userResolver = function ($name = null) {
            return $this->guard($name)->user();
        };
    }

    public function setDefaultDriver($name)
    {
        $this->app['config']['auth.defaults.guard'] = $name;
    }

つまり、認証チェックする度に、そのチェックに使ったガードをデフォルトのガードとするからです。adminで認証しているなら、admin がデフォルトのガードにセットされます。

もちろん、マルチ認証を使っている以上は、ガード名を意識しないといけない箇所はありますが(RedirectIfAuthenticated ミドルウエアなど)、必要以上にガード名を指定しなくても大丈夫、という感じです。

雑感

ソースをチラ見していると、結構こういう Laravel の優しさを感じる所があったりします。

間違い等ありましたらコメント下さい。

Discussion