
Creare progetto Laravel con Spatie/Permissions + Filament
By
Oggi andiamo a realizzare un progetto con:
- Laravel 12,
- Laravel Breeze per gestire la login e registrazione degli utenti,
- Spatie Permissions per i ruoli e i permessi degli utenti,
- Filament Admin Panel per il backend,
- Filament Shield per integrare i ruoli e permessi in Filament,
- TailwindCSS per il frontend
composer create-project laravel/laravel myapp
mv myapp/* .
mv myapp/.env .
<blockquote class="wp-block-quote">
<p>Attenzione al punto finale delle 2 righe sopra, indica di spostare il contenuto della cartella myapp in quella in cui ci troviamo.</p>
Adesso configuriamo il file .env con i dati relativi all’accesso al database e creiamo le tabelle con php artisan migrate
Autenticazione
Installiamo Laravel Breeze perché un pacchetto leggero e basato su TailwindCSS:
composer require laravel/breeze --dev php artisan breeze:install
Io qui ho risposto:
- Which Breeze stack would you like to install? Blade with Alpine
- Would you like dark mode support? Yes
- Which testing framework do you prefer? Pest
npm install && npm run dev php artisan migrate
Permessi
Passiamo a Spatie/Permissions.
composer require spatie/laravel-permission php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" php artisan migrate
La prima riga installa il pacchetto per la gestione dei permessi, la seconda pubblica i file di configurazione config/permission.php e la migration per creare la tabella che memorizzerà queste impostazioni per gli utenti.
Modifichiamo il file app/Models/User.php per includere la gestione dei ruoli per l’utente:
// app/Models/User.php
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable {
use HasRoles;
// ...
}Creiamo quindi alcuni ruoli utente:
// database/seeders/DatabaseSeeder.php
use Spatie\Permission\Models\Role;
public function run(): void {
Role::create(['name' => 'admin']);
Role::create(['name' => 'user']);
}Poi popoliamo la tabella dei ruoli con quelli appena inseriti nel Seeder:
php artisan db:seed
Filament Admin
E’ la volta del backend con l’installazione del pacchetto Filament:
composer require filament/filament php artisan filament:install php artisan filament:install --panels
Abbiamo così installato il pannello /admin e procediamo creando un utente amministratore:
php artisan make:filament-user
Diamo un nome, un’email e una password al nuovo utente, poi basta andare all’indirizzo del sito /admin/login per accedere alla dashboard del backend.
Collegamento Filament <-> Spatie Permissions
Avendo già degli utenti in Laravel (per ora in realtà uno solo…), dobbiamo insegnare a Filament di usare gli stessi utenti perché non vogliamo doppioni inutili. Modifichiamo il file app/Providers/Filament/AdminPanelProvider.php così:
<?php
namespace App\Providers\Filament;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\AuthenticateSession;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
use Filament\Pages\Dashboard;
use Filament\Panel;
use Filament\PanelProvider;
use Filament\Support\Colors\Color;
use Filament\Widgets\AccountWidget;
use Filament\Widgets\FilamentInfoWidget;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return
$panel
->default()
->id('admin')
->path('admin')
->authGuard('web') // <-- Per usare gli stessi utenti di Laravel in Filament
->login() ->colors([
'primary' => Color::Amber,
])
->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages')
->pages([
Dashboard::class,
])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets')
->widgets([
AccountWidget::class,
FilamentInfoWidget::class,
])
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
AuthenticateSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
])
->authMiddleware([ Authenticate::class, ]);
}
}Poi aggiungiamo al modello User.php la limitazione al pannello di Filament agli admin:
public function canAccessPanel(\Filament\Panel $panel): bool
{
return $this->hasRole('admin');
}Adesso sincronizziamo Spatie/Permission con Filament:
composer require bezhansalleh/filament-shield
Consiglio di prendere visione della documentazione ufficiale:
Poi prosegui in questo modo:
php artisan shield:setup
Rispondendo alle domande e arrivando al termine dello script si dovrebbe aver installato tutto il necessario per gestire i ruoli da Filament!