iotronlab/filament-multi-guard
Installation:
composer require iotronlab/filament-multi-guard
Ensure you're using Filament v2 (not v3, as noted in the README).
Publish Config:
php artisan vendor:publish --provider="Iotronlab\FilamentMultiGuard\FilamentMultiGuardServiceProvider" --tag="filament-multi-guard-config"
This generates config/filament-multi-guard.php.
Register Guards:
Define guards in config/filament-multi-guard.php:
'guards' => [
'admin' => [
'guard' => 'web',
'middleware' => ['web', 'auth:sanctum'],
'resources' => ['posts', 'users'],
'pages' => ['dashboard', 'profile'],
],
'client' => [
'guard' => 'web',
'middleware' => ['web', 'auth:client'],
'resources' => ['client-posts'],
'pages' => ['client-dashboard'],
],
],
First Use Case:
Register the package in AppServiceProvider:
use Iotronlab\FilamentMultiGuard\Facades\FilamentMultiGuard;
public function boot()
{
FilamentMultiGuard::register();
}
Now, Filament will automatically route resources/pages to their respective guards.
Guard-Specific Routing:
guard() method in policies or middleware to enforce context:
if (FilamentMultiGuard::guard() === 'client') {
// Client-specific logic
}
Dynamic Resource Registration:
FilamentMultiGuard::registerResource('posts', PostResource::class, 'admin');
Middleware Integration:
FilamentMultiGuard::middleware(['verified'])->forGuards(['client']);
Widget Isolation:
config/filament.php:
'widgets' => [
'stats' => [
'guard' => 'admin',
],
],
Authentication Fallbacks:
FilamentMultiGuard::fallbackGuard('admin'); // Fallback to 'admin' if guard not found
auth:sanctum or auth:api in guard middleware for API-based auth.Guard class to add logic (e.g., role-based access):
FilamentMultiGuard::extend('admin', function () {
return new CustomAdminGuard();
});
FilamentMultiGuard::shouldReceive('guard')->andReturn('client');
Filament v3 Incompatibility: The package only works with Filament v2. Migrate to Filament v3’s native multi-tenant support if upgrading.
Middleware Order: Ensure guard middleware runs after Filament’s auth middleware to avoid conflicts:
// config/filament.php
'middleware' => [
\Filament\Panel::class,
'web',
\Iotronlab\FilamentMultiGuard\Middleware\GuardMiddleware::class, // Must come last
],
Resource/Policy Conflicts:
Avoid naming collisions (e.g., posts resource in both admin and client guards). Use namespacing:
'resources' => [
'admin/posts',
'client/posts',
],
Caching Issues: Clear Filament’s route cache after adding/removing guards:
php artisan filament:cache-reset
\Log::info('Current guard:', ['guard' => FilamentMultiGuard::guard()]);
php artisan route:list to verify guard-specific routes are registered.Custom Guard Logic:
Override the Guard class to add logic (e.g., tenant resolution):
FilamentMultiGuard::macro('resolveTenant', function () {
return Tenant::findOrFail(request('tenant'));
});
Dynamic Guard Registration: Register guards programmatically in a service provider:
FilamentMultiGuard::registerGuard('tenant', [
'guard' => 'web',
'middleware' => ['web', 'tenant'],
]);
Fallback Guards: Configure fallback guards for unmatched routes:
'fallback_guard' => 'admin',
Guard-Specific Views:
Override Filament views per guard using view.guard namespace:
// resources/views/vendor/filament/guard/admin/partials/header.blade.php
How can I help you explore Laravel packages today?