ERR_TOO_MANY_REDIRECTS Mutiple Panels Single Panel For Auth Login

Hey! I've set up 4 Filament panels in my Laravel app: Admin, Student, Guardian, and App. Each has its own dashboard like /admin/dashboard, except App, which is just for login/registration. After login, users are redirected to their role’s dashboard via a custom LoginResponse. Example: admin → /admin/dashboard. Issue: When logged in and visiting /app, I get a "Too many redirects" error. When logged out, it redirects to the login page (which is fine). How can I disable or prevent /app access after login? Here’s my App panel(Default Panel):
$panel
->default()
->id('app')
->path('app')
->login()
->registration()
->middleware(FilamentDefaults)
->authMiddleware([Authenticate::class])
$panel
->default()
->id('app')
->path('app')
->login()
->registration()
->middleware(FilamentDefaults)
->authMiddleware([Authenticate::class])
Admin panel uses:
$panel
->id('rolepanels') ->example admin|guardian|student
->path('rolepanels')
->pages([Dashboard::class])
->middleware(FilamentDefaults)
->authMiddleware([
EnsureUserHasRole::class.':admin',
Authenticate::class,
])
$panel
->id('rolepanels') ->example admin|guardian|student
->path('rolepanels')
->pages([Dashboard::class])
->middleware(FilamentDefaults)
->authMiddleware([
EnsureUserHasRole::class.':admin',
Authenticate::class,
])
EnsureUserHasRole.php
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string $role): Response
{
if (! Auth::check() || ! Auth::user()->hasRole($role)) {
abort(403, 'Access denied. You do not have permission to access this panel.');
}

return $next($request);
}
}
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string $role): Response
{
if (! Auth::check() || ! Auth::user()->hasRole($role)) {
abort(403, 'Access denied. You do not have permission to access this panel.');
}

return $next($request);
}
}
running out of characters wil post the response class next
4 Replies
KingStalker
KingStalkerOP4mo ago
class LoginResponse extends BaseLoginResponse
{
public function toResponse($request): RedirectResponse|Redirector
{
$user = Auth::User();

return match ($user->role->value) {
'admin' => redirect()->intended(AdminDashboard::getUrl(panel: 'admin')),
'guardian' => redirect()->intended(GuardianDashboard::getUrl(panel: 'guardian')),
'student' => redirect()->intended(StudentDashboard::getUrl(panel: 'student')),
default => parent::toResponse($request),
};
}
}

class RegisterResponse extends BaseRegistrationResponse
{
public function toResponse($request): RedirectResponse|Redirector
{
return redirect()->intended(StudentDashboard::getUrl(panel: 'student'));
}
}

class LogoutResponse extends BaseLogoutResponse
{
public function toResponse($request): RedirectResponse
{
session()->flush();

return redirect()->to(route('filament.app.auth.login'));
}
}

public function register(): void
{
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
$this->app->singleton(RegistrationResponseContract::class, RegisterResponse::class);
$this->app->singleton(LogoutResponseContract::class, LogoutResponse::class);
}
class LoginResponse extends BaseLoginResponse
{
public function toResponse($request): RedirectResponse|Redirector
{
$user = Auth::User();

return match ($user->role->value) {
'admin' => redirect()->intended(AdminDashboard::getUrl(panel: 'admin')),
'guardian' => redirect()->intended(GuardianDashboard::getUrl(panel: 'guardian')),
'student' => redirect()->intended(StudentDashboard::getUrl(panel: 'student')),
default => parent::toResponse($request),
};
}
}

class RegisterResponse extends BaseRegistrationResponse
{
public function toResponse($request): RedirectResponse|Redirector
{
return redirect()->intended(StudentDashboard::getUrl(panel: 'student'));
}
}

class LogoutResponse extends BaseLogoutResponse
{
public function toResponse($request): RedirectResponse
{
session()->flush();

return redirect()->to(route('filament.app.auth.login'));
}
}

public function register(): void
{
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
$this->app->singleton(RegistrationResponseContract::class, RegisterResponse::class);
$this->app->singleton(LogoutResponseContract::class, LogoutResponse::class);
}
Matthew
Matthew4mo ago
You've got a loop somewhere, find that. Usually by dd'ing each step.
toeknee
toeknee4mo ago
As above, or use Laravel Log functionality to log each step and you'll. see where your getting too in the loop continuousl.y
MauFunction
MauFunction4mo ago
It's probably the default filament Authenticate middleware, i replaced that with a custom version with changes to redirectUsing By default it redirects to the default or current panel login url, not 100% sure im on phone

Did you find this page helpful?