37.

Laravel 認証後のリダイレクト先を変更する方法(Breeze / Fortify / Jetstream / 旧 UI 対応)

編集
この記事の要点
  • Laravel 6 系まで: LoginController::$redirectTo / RegisterController::$redirectTo / ResetsPasswordsController::$redirectTo を上書き
  • Laravel 8+ Fortify / Jetstream / Breeze: app/Providers/RouteServiceProvider.phpHOME 定数を変更するのが最短
  • Fortify の場合は config/fortify.phphome でも可。さらに細かい制御は app/Actions/Fortify/... のリダイレクトレスポンサを差し替え
  • 動的に振り分けたいときは authenticated() メソッドをオーバーライド(管理者は /admin、一般は /dashboard 等)
  • 意図した URL に戻したい場合は redirect()->intended("/home") を活用(ログイン前の URL を覚えている)

変更すべき箇所はバージョンと足回りで異なる

環境変更箇所
Laravel 6 / 7(laravel/ui 同梱の旧 UI)App\Http\Controllers\Auth\LoginController::$redirectTo
Laravel 8+ Breezeapp/Providers/RouteServiceProvider.phpHOME 定数
Laravel 8+ Fortify / Jetstreamconfig/fortify.phphome または RouteServiceProvider::HOME
動的振り分け(権限別)authenticated() をオーバーライド、または LoginResponse をバインド

① 旧 UI(Laravel 6 / 7)の場合

// app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
    use AuthenticatesUsers;

    // ログイン成功後のリダイレクト先
    protected $redirectTo = '/dashboard';
}

// app/Http/Controllers/Auth/RegisterController.php
class RegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = '/welcome';
}

// app/Http/Controllers/Auth/ResetPasswordController.php
class ResetPasswordController extends Controller
{
    use ResetsPasswords;

    protected $redirectTo = '/dashboard';
}

② Laravel 8+ Breeze の場合

// app/Providers/RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider
{
    /**
     * ログイン・登録・パスワードリセット後の共通遷移先
     */
    public const HOME = '/dashboard';
}

Breeze は app/Http/Controllers/Auth/AuthenticatedSessionController.php 内部で redirect()->intended(RouteServiceProvider::HOME) を呼んでいるため、HOME 定数を変えるだけで全てのフローの遷移先が変わります。

③ Fortify / Jetstream の場合

// config/fortify.php
return [
    // ...
    'home' => '/dashboard',  // ← ここ
    // ...
];

// または RouteServiceProvider::HOME を変えても同じ

④ 動的にリダイレクト先を変える(権限別など)

「管理者なら /admin、一般ユーザーなら /dashboard」のように振り分けたい場合は、authenticated() メソッドをオーバーライドします:

// app/Http/Controllers/Auth/LoginController.php (旧 UI / 自作 Login の場合)
class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected function authenticated($request, $user)
    {
        if ($user->is_admin) {
            return redirect('/admin');
        }
        if ($user->role === 'editor') {
            return redirect('/editor');
        }
        return redirect('/dashboard');
    }
}

⑤ Fortify でレスポンサを差し替える(推奨パターン)

Fortify は 「レスポンスクラス」で挙動を変えるアーキテクチャです。コンテナにバインドし直すことでログイン・登録・PW リセット後のレスポンスを自由に変えられます。

// app/Http/Responses/LoginResponse.php
namespace App\Http\Responses;

use Illuminate\Http\Request;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{
    public function toResponse($request)
    {
        $user = $request->user();
        if ($user->is_admin) {
            return redirect()->intended('/admin');
        }
        return redirect()->intended('/dashboard');
    }
}

// app/Providers/FortifyServiceProvider.php
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use App\Http\Responses\LoginResponse;

public function register()
{
    $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
}

同様に RegisterResponse / PasswordResetResponse / LogoutResponse もバインドできます。

⑥ intended() による「元の URL に戻す」

未ログイン状態で保護ページにアクセスし、ログインさせた後で元の URL に戻したい場合は intended() を使います:

// 未ログイン時のアクセス先を覚えている
return redirect()->intended('/dashboard');
// → 元の URL があればそこへ、無ければ /dashboard へ

// 元の URL を明示的に取得
$url = session()->pull('url.intended', '/default');

変更後の確認

# 設定キャッシュをクリア
php artisan config:clear
php artisan cache:clear
php artisan route:clear

# 実際にログインして遷移先を確認
# 404 になる場合はルート未定義
php artisan route:list | grep dashboard

FAQ

Q: ログアウト後の遷移先を変えたい
A: Breeze なら AuthenticatedSessionController::destroy() 内の redirect('/') を編集。Fortify なら LogoutResponse をバインド。

Q: SPA で API 認証している
A: API には「リダイレクト」概念は無いので、ログイン成功 JSON を返すだけ。フロント側で URL 遷移を制御します。

Q: ユーザーごとに異なる「初回ログイン処理」を入れたい
A: authenticated() 内で $user->first_login_at をチェックして、初回なら /welcome-tour へ。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)