Search code examples
phplaravellaravel-blademiddlewarelaravel-middleware

Laravel Custom Middleware: ERR_TOO_MANY_REDIRECTS


I'm using Laravel Breeze + Inertia (React) and want to implement custom auth.

I'm having infinite redirection (ERR_TOO_MANY_REDIRECTS) when visiting /dashboard on this middleware.

Route::get('register', [RegisteredUserController::class, 'create'])
    ->name('register');

Route::post('register', [RegisteredUserController::class, 'store']);

Route::get('login', [AuthenticatedSessionController::class, 'create'])
    ->name('login');

Route::post('login', [AuthenticatedSessionController::class, 'store']);

Route::middleware(['custom_auth'])->group(function () {
    Route::get('/dashboard', function () {
        return Inertia::render('Dashboard');
    })->name('dashboard');
});

class CustomAuthMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        if (session()->has('user_data')) {
            return redirect(RouteServiceProvider::HOME);
        }

        return $next($request);
    }
}

Solution

  • This works:

    namespace App\Http\Middleware;
    
    class RedirectIfAuthenticated
    {
        public function handle(Request $request, Closure $next, ...$guards)
        {
            if (session()->has('user_data')) {
                return redirect()->route('users.index');
            }
    
            return $next($request);
        }
    }
    
    namespace App\Http\Middleware;
    
    class CustomAuthMiddleware
    {
        public function handle(Request $request, Closure $next)
        {
            if (session()->has('user_data')) {
                return $next($request);
            }
    
            return redirect('login');
        }
    }
    
    Route::middleware('guest')->group(function () {
        Route::get('register', [AuthController::class, 'register'])
            ->name('register');
    
        Route::post('register', [AuthController::class, 'registerPost']);
    
        Route::get('login', [AuthController::class, 'login'])
            ->name('login');
    
        Route::post('login', [AuthController::class, 'loginPost']);
    });
    
    Route::middleware('custom_auth')->group(function () {
        Route::get('/', function () { return redirect()->route('users.index'); });
    
        Route::resource('users', UserController::class);
    });