【Laravel】ログイン後のリダイレクト先を動的に変更する方法|ユーザー属性別に分岐

【Laravel】ログイン後のリダイレクト先を動的に変更する方法|ユーザー属性別に分岐 Laravel

Laravelでログイン処理を実装する際、ログイン後のリダイレクト先をユーザーの属性によって変えたいというケースは多くあります。たとえば、「管理者は管理画面へ」「一般ユーザーはマイページへ」など、役割に応じた遷移先を出し分けたい場面です。

この記事では、Laravelのログイン後のリダイレクト処理を動的にカスタマイズする方法について、認証機能(Laravel Breeze等)の仕組みと実装例を交えて解説します。

前提:usersテーブルにroleカラムを持つ場合

ユーザーが「管理者」か「一般ユーザー」かを区別するために、usersテーブルにroleカラム(例:admin, userなど)を用意している前提とします。

Schema::table('users', function (Blueprint $table) {
    $table->string('role')->default('user'); // 例: user or admin
});

Authenticatedセッション後のリダイレクト処理を上書きする

Laravel BreezeやJetstreamなどでログイン認証を使っている場合、AuthenticatedSessionController内のstoreメソッドをカスタマイズすることで、ログイン後のリダイレクト先を動的に変更できます。

以下はBreezeの場合の例です。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthenticatedSessionController extends Controller
{
    public function store(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        if (!Auth::attempt($request->only('email', 'password'), $request->filled('remember'))) {
            return back()->withErrors([
                'email' => '認証に失敗しました',
            ]);
        }

        $request->session()->regenerate();

        // ユーザー属性によってリダイレクト先を分岐
        $user = Auth::user();

        if ($user->role === 'admin') {
            return redirect()->intended('/admin/dashboard');
        } else {
            return redirect()->intended('/mypage');
        }
    }
}

RedirectsUsersトレイトを使っている場合(Laravel標準Auth)

RedirectsUsersトレイトが使われている場合は、redirectTo()メソッドをオーバーライドするだけで分岐が可能です。

protected function redirectTo()
{
    if (Auth::user()->role === 'admin') {
        return '/admin/dashboard';
    }

    return '/mypage';
}

LoginControllerなどにこのメソッドを追加することで、ログイン後の遷移を柔軟に制御できます。

ルーティングの設定例

分岐先のURLに応じて、routes/web.phpに適切なルートを定義しておきましょう。

Route::get('/admin/dashboard', [AdminController::class, 'index'])->middleware('auth');
Route::get('/mypage', [UserController::class, 'index'])->middleware('auth');

それぞれのルートに認証ミドルウェアを適用することで、ログインしていないユーザーのアクセスを防げます。

ガードや複数認証を使いたい場合

管理者と一般ユーザーでテーブルやガードを分けたい場合は、config/auth.phpの設定をカスタマイズして、ガードごとにリダイレクト先を定義することも可能です。

この場合は、ミドルウェアやログイン処理も個別に作る必要がありますが、より厳密な管理が可能になります。

まとめ

Laravelでは、ログイン後のリダイレクト先をユーザー属性に応じて柔軟にコントロールできます。簡単な要件ならredirectTo()のオーバーライド、高度な要件ならコントローラ内で分岐させることで、要望に応じた挙動を実現できます。

ユーザーの体験向上やアクセス制御の強化のためにも、適切なリダイレクト設計を意識しておくことが重要です。