Custom Login & Logout Redirects in Filament v4
James Manager
When working with Filament v4, you often need more control over where users land after they log in or log out. By default:
- After login → users are sent to the panel’s dashboard
- After logout → users are redirected to the login page
This works fine for simple apps, but if you’re building a custom web application like an e-commerce platform where Filament is used as the dashboard and the store front is different or want smoother flows, you’ll likely need custom redirects.
Why Redirects Matter
In multi-panel or role-based apps, default redirects may feel clunky. Common needs include:
- After Login → Redirect users to the page they tried to visit or their dashboard
- After Logout → Redirect users back to your public home page
- Intent Preservation → Remember users’ target page when they were stopped by the login screen
Step 1: Custom LoginResponse
Create app/Filament/Dashboard/Pages/Auth/LoginResponse.php:
<?php
namespace App\Filament\Dashboard\Pages\Auth;
use Illuminate\Http\RedirectResponse;
use Livewire\Features\SupportRedirects\Redirector;
use Filament\Auth\Http\Responses\Contracts\LoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
{
public function toResponse($request): RedirectResponse|Redirector
{
if (session()->has('intended_url')) {
$intendedUrl = session()->pull('intended_url');
return redirect()->to($intendedUrl);
}
return redirect()->intended(filament()->getUrl());
}
}
- Implements Filament’s contract
- Checks intended_url in session
- Falls back to panel home
Step 2: Custom LogoutResponse
Create app/Filament/Dashboard/Pages/Auth/LogoutResponse.php:
<?php
namespace App\Filament\Dashboard\Pages\Auth;
use Illuminate\Http\RedirectResponse;
use Filament\Auth\Http\Responses\Contracts\LogoutResponse as Responsable;
class LogoutResponse implements Responsable
{
public function toResponse($request): RedirectResponse
{
return redirect()->route('home');
}
}Step 3: Register in Service Provider
Edit AppServiceProvider:
use App\Filament\Dashboard\Pages\Auth\LoginResponse;
use App\Filament\Dashboard\Pages\Auth\LogoutResponse;
use Filament\Auth\Http\Responses\Contracts\LoginResponse as LoginResponseContract;
use Filament\Auth\Http\Responses\Contracts\LogoutResponse as LogoutResponseContract;
public function register(): void
{
$this->app->bind(LogoutResponseContract::class, LogoutResponse::class);
$this->app->bind(LoginResponseContract::class, LoginResponse::class);
}By swapping Filament’s default responses with your own, you ensure a seamless experience across dashboards, logins, and logouts.
Share this article
Related Articles
Custom Uniqueness Validation with Spatie Tags in Laravel
Using Spatie’s multilingual tagging system? Here's how to write a Laravel validation rule that ensures tags remain unique across locales
Implementing a Single Custom Login Page for all Panels in FilamentPHP
Learn how to use custom page for login and registration across multiple panels in FilamentPHP.
Introducing FrontDesk: Your Open-Source Visitor Management System
Streamline visitor check-ins with FrontDesk, an open-source Visitor Management System built with Laravel & Filament PHP.