Filament Multi Auth Guard Assistant
You are a Filament multi-authentication specialist. Help configure multiple panels with separate auth guards, tables, and models for different user types.
Overview
No Filament, cada Panel pode ter seu proprio auth guard, permitindo autenticacao separada para diferentes tipos de usuarios (admin, member, vendor, etc.) com tabelas e login pages independentes.
Quick Setup Checklist
- Configurar guards e providers no Laravel (
config/auth.php) - Criar migration e model para cada tipo de usuario
- Criar Panel Provider para cada tipo
- Configurar
authGuard()no Panel - Implementar
FilamentUserno model - Configurar password reset broker
Step 1: Guards e Providers (config/auth.php)
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'member' => [
'driver' => 'session',
'provider' => 'members',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
'members' => [
'driver' => 'eloquent',
'model' => App\Models\Member::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_reset_tokens',
'expire' => 60,
'throttle' => 60,
],
'admins' => [
'provider' => 'admins',
'table' => 'password_reset_tokens',
'expire' => 60,
'throttle' => 60,
],
'members' => [
'provider' => 'members',
'table' => 'password_reset_tokens',
'expire' => 60,
'throttle' => 60,
],
],
Step 2: Model
<?php
// app/Models/Admin.php
namespace App\Models;
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Admin extends Authenticatable implements FilamentUser
{
use HasFactory, Notifiable;
protected $fillable = ['name', 'email', 'password'];
protected $hidden = ['password', 'remember_token'];
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
public function canAccessPanel(Panel $panel): bool
{
return true;
}
}
Step 3: Criar Panel
php artisan make:filament-panel admin
php artisan make:filament-panel member
Configuracao por Versao do Filament
Filament v3
<?php
// app/Providers/Filament/AdminPanelProvider.php
namespace App\Providers\Filament;
use Filament\Panel;
use Filament\PanelProvider;
use Filament\Pages\Dashboard;
use Filament\Support\Colors\Color;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('admin')
->path('admin')
->colors(['primary' => Color::Amber])
->authGuard('admin')
->login()
->registration()
->passwordReset()
->authPasswordBroker('admins')
->emailVerification()
->profile()
->pages([Dashboard::class])
->discoverResources(
in: app_path('Filament/Admin/Resources'),
for: 'App\\Filament\\Admin\\Resources'
)
->discoverPages(
in: app_path('Filament/Admin/Pages'),
for: 'App\\Filament\\Admin\\Pages'
);
}
}
Filament v4
<?php
// app/Providers/Filament/AdminPanelProvider.php
namespace App\Providers\Filament;
use Filament\Panel;
use Filament\PanelProvider;
use Filament\Pages\Dashboard;
use Filament\Support\Colors\Color;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('admin')
->path('admin')
->colors(['primary' => Color::Amber])
->authGuard('admin')
->login()
->registration()
->passwordReset()
->authPasswordBroker('admins')
->emailVerification()
->profile()
->pages([Dashboard::class])
->discoverResources(
in: app_path('Filament/Admin/Resources'),
for: 'App\\Filament\\Admin\\Resources'
)
->discoverPages(
in: app_path('Filament/Admin/Pages'),
for: 'App\\Filament\\Admin\\Pages'
);
}
}
Mudancas no v4:
FilamentUsercontract continua obrigatorio em producao- MFA disponivel via
->multiFactorAuthentication() - Mesma API de
authGuard()eauthPasswordBroker()
Filament v5
<?php
// app/Providers/Filament/AdminPanelProvider.php
namespace App\Providers\Filament;
use Filament\Panel;
use Filament\PanelProvider;
use Filament\Pages\Dashboard;
use Filament\Support\Colors\Color;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('admin')
->path('admin')
->colors(['primary' => Color::Amber])
->authGuard('admin')
->login()
->registration()
->passwordReset()
->authPasswordBroker('admins')
->emailVerification()
->profile()
->pages([Dashboard::class])
->discoverResources(
in: app_path('Filament/Admin/Resources'),
for: 'App\\Filament\\Admin\\Resources'
)
->discoverPages(
in: app_path('Filament/Admin/Pages'),
for: 'App\\Filament\\Admin\\Pages'
);
}
}
Mudancas no v5:
- Requer Livewire 4.x
- Mesma API de panel configuration
- MFA com
AppAuthenticationeEmailAuthentication
Abordagem: Tabela Separada vs Tabela Unica
Tabela Separada (Recomendado para isolamento total)
Cada tipo de usuario tem sua propria tabela e model:
admins table → Admin model → admin guard → Admin Panel
members table → Member model → member guard → Member Panel
users table → User model → web guard → App Panel
Tabela Unica com Global Scope
Mesma tabela users, models com scope que filtram por role:
class Admin extends User
{
protected $table = 'users';
protected static function booted(): void
{
static::addGlobalScope('admin', function (Builder $builder) {
$builder->where('role', 'admin');
});
}
}
Tabela Unica com Spatie Permission
class Member extends User
{
protected $table = 'users';
protected static function booted(): void
{
static::addGlobalScope('is_member', function (Builder $builder) {
$builder->whereHas('roles', fn ($q) => $q->where('name', 'member'));
});
}
}
Importante: Ao usar tabela unica, lembrar de atribuir a role durante o registro (listener ou extendendo a pagina Register).
canAccessPanel por Panel ID
public function canAccessPanel(Panel $panel): bool
{
return match ($panel->getId()) {
'admin' => $this->hasRole('admin'),
'member' => $this->hasRole('member'),
default => true,
};
}
Customizar Pagina de Login
use Filament\Pages\Auth\Login;
class AdminLogin extends Login
{
public function form(Form $form): Form
{
return $form->schema([
$this->getEmailFormComponent(),
$this->getPasswordFormComponent(),
$this->getRememberFormComponent(),
]);
}
}
// No PanelProvider
->login(AdminLogin::class)
Customizar Registro com Role
use Filament\Pages\Auth\Register;
class MemberRegister extends Register
{
protected function afterRegister(): void
{
$this->getUser()->assignRole('member');
}
}
// No PanelProvider
->registration(MemberRegister::class)
Reference Files
~/.claude/skills/filament/multi-auth-guard.md~/.claude/skills/laravel/multi-auth-guard.md