マルチログインで未認証のリダイレクト

2021/03/08

Laravel では Auth や Jetstream で認証機能を実装できますが、マルチログインは結構面倒です。

例えば未認証のリダイレクト処理はミドルウェアの Authenticate->redirectTo() で処理していますが、シングルログイン(user)の記述です。

Authenticate のデフォルト設定

app/Http/Middleware/Authenticate.php


    protected function redirectTo($request)
    {
        if (!$request->expectsJson()) {
            return route('login');
        }
    }

ここで user、admin 2つのマルチドメイン認証で「/user/xxx」「/admin/xxx」にアクセスしたとき、上記のルーティングでは「/login」にリダイレクトされてしまいます。

また「/login」でなく「/user/login」「/admin/login」でルーティングすると当然ながら Routing エラーになります。


Symfony\Component\Routing\Exception\RouteNotFoundException
Route [login] not defined.

Authenticate の修正

2つの認証「user」「admin」が未承認時、「/user/login」「/admin/login」 にリダイレクトするよう修正します。今回は直接「user」「admin」と直接設定しましたが、ループ処理は guard の設定と連携してもよいかと思います。


    protected function redirectTo($request)
    {
        if (!$request->expectsJson()) {
            foreach (['user', 'admin'] as $user) {
                if ($request->routeIs("{$user}.*)) {
                    return route("{$user}.login");
                }
            }
        }
    }

また、認証処理を user、admin の各コントローラーのコンストラクタやサービスなどで認証する場合は、 Authenticate->redirectTo() は無効にする必要があります。