Use Single Login Route For Multiple Panels

I'm using multiple panels in my Filament app, but each panel has its own login page. I want a single login page at domain/login, and after authentication, users should be redirected to their respective panel based on their role. Example: Instead of separate login pages for each panel: admin/login group/login I want a unified login page at domain/login for all users. After login: A user with the admin-user role should be redirected to the AdminPanel. A user with the group-user role should be redirected to the GroupPanel. How can I achieve this?
3 Replies
Pro Programmer
Pro ProgrammerOP2w ago
Actually i want a URL like domain/login and if i login in with credentials which has role admin-user should be redirected to the domain/admin and similarly for the group panel. How I did : I created another Panel called LoginPanel and used the above provided video reference for multi panel single login and i made the LoginPanel as default. Below i provided the code for reference: Login Panel:
class LoginPanelProvider extends PanelProvider

{

public function panel(Panel $panel): Panel

{

return $panel

->default()

->id('login')

->path('')

->login()

->colors([

'primary' => Color::Amber,

])

->middleware([

RoutesAccessMiddleware::class,

])

}

}
class LoginPanelProvider extends PanelProvider

{

public function panel(Panel $panel): Panel

{

return $panel

->default()

->id('login')

->path('')

->login()

->colors([

'primary' => Color::Amber,

])

->middleware([

RoutesAccessMiddleware::class,

])

}

}
Admin Panel:
class AdminPanelProvider extends PanelProvider

{

public function panel(Panel $panel): Panel

{

return $panel

->id('admin')

->path('admin')

->login()

->middleware([

RoutesAccessMiddleware::class,

])

->authMiddleware([

RedirectToProperPanelMiddleware::class,

Authenticate::class,

])->plugin(FilamentSpatieRolesPermissionsPlugin::make())

;

}
class AdminPanelProvider extends PanelProvider

{

public function panel(Panel $panel): Panel

{

return $panel

->id('admin')

->path('admin')

->login()

->middleware([

RoutesAccessMiddleware::class,

])

->authMiddleware([

RedirectToProperPanelMiddleware::class,

Authenticate::class,

])->plugin(FilamentSpatieRolesPermissionsPlugin::make())

;

}
Group Panel:
class GroupPanelProvider extends PanelProvider

{

public function panel(Panel $panel): Panel

{

return $panel

->id('group')

->path('group')

->login()

->middleware([

RoutesAccessMiddleware::class,

])

->authMiddleware([

RedirectToProperPanelMiddleware::class,

Authenticate::class,

]);

}
class GroupPanelProvider extends PanelProvider

{

public function panel(Panel $panel): Panel

{

return $panel

->id('group')

->path('group')

->login()

->middleware([

RoutesAccessMiddleware::class,

])

->authMiddleware([

RedirectToProperPanelMiddleware::class,

Authenticate::class,

]);

}
RoutesAccessMiddleware:
public function handle(Request $request, Closure $next): Response

{

// Redirect unauthenticated users trying to access protected routes

if (!auth()->check()) {

if ($request->is('group*') || $request->is('admin*')) {

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

}

}

// Redirect authenticated users away from the login routes

if (auth()->check()) {

if ($request->is('group/login')) {

if (auth()->user()->hasRole('group-user')) {

return redirect()->route('filament.group.pages.dashboard');

} else {

// If the user doesn't have the group-admin role

abort(403, 'Unauthorized Action');

}

}

if ($request->is('admin/login')) {

if (auth()->user()->hasRole('admin-user')) {

return redirect()->route('filament.admin.pages.dashboard');

} else {

// If the user doesn't have the super-admin role

abort(403, 'Unauthorized Action');
}
}

if (auth()->check()) {

if ($request->is('/login')) {

if (auth()->user()->hasRole('admin-user')) {

return redirect()->route('filament.admin.pages.dashboard');

} else {
abort(403, 'Unauthorized Action');
}
}

if ($request->is('/login')) {

if (auth()->user()->hasRole('group-user')) {

return redirect()->route('filament.group.pages.dashboard');

} else {
abort(403, 'Unauthorized Action');

}
}
}
}
return $next($request);
}
public function handle(Request $request, Closure $next): Response

{

// Redirect unauthenticated users trying to access protected routes

if (!auth()->check()) {

if ($request->is('group*') || $request->is('admin*')) {

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

}

}

// Redirect authenticated users away from the login routes

if (auth()->check()) {

if ($request->is('group/login')) {

if (auth()->user()->hasRole('group-user')) {

return redirect()->route('filament.group.pages.dashboard');

} else {

// If the user doesn't have the group-admin role

abort(403, 'Unauthorized Action');

}

}

if ($request->is('admin/login')) {

if (auth()->user()->hasRole('admin-user')) {

return redirect()->route('filament.admin.pages.dashboard');

} else {

// If the user doesn't have the super-admin role

abort(403, 'Unauthorized Action');
}
}

if (auth()->check()) {

if ($request->is('/login')) {

if (auth()->user()->hasRole('admin-user')) {

return redirect()->route('filament.admin.pages.dashboard');

} else {
abort(403, 'Unauthorized Action');
}
}

if ($request->is('/login')) {

if (auth()->user()->hasRole('group-user')) {

return redirect()->route('filament.group.pages.dashboard');

} else {
abort(403, 'Unauthorized Action');

}
}
}
}
return $next($request);
}
LoginResponse:
class LoginResponse extends BaseLoginResponse

{

public function toResponse($request): RedirectResponse|Redirector

{

if (auth()->user()->hasRole('group-user')) {

return redirect()->route('filament.group.pages.dashboard');

}else if(auth()->user()->hasRole('admin-user'))

{

return redirect()->route('filament.admin.pages.dashboard');

}

return parent::toResponse($request);

}

}
class LoginResponse extends BaseLoginResponse

{

public function toResponse($request): RedirectResponse|Redirector

{

if (auth()->user()->hasRole('group-user')) {

return redirect()->route('filament.group.pages.dashboard');

}else if(auth()->user()->hasRole('admin-user'))

{

return redirect()->route('filament.admin.pages.dashboard');

}

return parent::toResponse($request);

}

}
LogoutResponse:
class LogoutResponse extends BaseLogoutResponse

{

public function toResponse($request): RedirectResponse

{

if (Filament::getCurrentPanel()->getId() === 'group') {

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

} else if (Filament::getCurrentPanel()->getId() === 'admin') {

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

}

return parent::toResponse($request);

}

}
class LogoutResponse extends BaseLogoutResponse

{

public function toResponse($request): RedirectResponse

{

if (Filament::getCurrentPanel()->getId() === 'group') {

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

} else if (Filament::getCurrentPanel()->getId() === 'admin') {

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

}

return parent::toResponse($request);

}

}
Everything is working as expected but the issue i am facing is that when the user is logged in as any role suppose as admin-user and in domain/admin and if i change the URL to domain/login then it is redirected to domain. What i want is if logged in any user tries to access the domain/login then it should redirect to their respective panel dashboard.
Rolland
Rolland2w ago
Filament Examples
Filament Multiple Panels: Single Login Page for Admin/User Roles
Having multiple panels is excellent for separating users from other roles. However, managing each different login page can be tricky. So, let's make one login page for all panels and switch redirects based on roles.

Did you find this page helpful?