Middleware AutoPermissions e Utilizzo Runtime
Il middleware AutoPermissionsMiddleware è il componente runtime che si occupa della verificazione automatica dei permessi durante le richieste HTTP. Questo middleware è completamente integrato nel sistema e funziona in modo trasparente una volta configurato.
Come Funziona il Middleware
Processo Dettagliato
- Estrazione Route: Il middleware estrae informazioni dalla route corrente
- Cache Check: Verifica se il permesso è già in cache
- Calcolo Permesso: Se non in cache, calcola il permesso necessario
- Verificazione Utente: Controlla se l'utente autenticato ha il permesso
- Decisione: Permette l'accesso o restituisce errore 403
Configurazione del Middleware
Registrazione nel Sistema
Il middleware viene registrato automaticamente dal sistema in bootstrap/app.php:
// Il middleware viene applicato automaticamente ai controller
// che hanno l'attributo #[AutoPermissions] o il trait HasAutoPermissionsTrait
Applicazione Automatica
Il middleware si applica automaticamente quando:
- Un controller ha l'attributo
#[AutoPermissions] - Un controller usa il trait
HasAutoPermissionsTrait
Logica di Verificazione Permessi
Estrazione del Permesso dalla Route
Il middleware utilizza queste informazioni per determinare il permesso richiesto:
// Esempio di route: api.shared.users.index
// Action: App\Shared\Http\Controllers\UserController@index
// Permesso calcolato: shared.users.index
Algoritmo di Calcolo
- Parsing Action: Estrae modulo, controller e metodo dalla stringa action
- Controllo Attributi: Verifica attributi di personalizzazione sul controller
- Naming Resolution: Risolve il nome finale del permesso
- Cache Storage: Memorizza il risultato per richieste future
Sistema di Cache
Strategia di Caching
Il middleware utilizza una strategia di cache dual-layer:
Cache Key Ottimizzata
// Formato: route_permissions_{route_name}
// Esempio: route_permissions_api_shared_users_index
Configurazione Cache
| Parametro | Valore | Descrizione |
|---|---|---|
| TTL | 3600 secondi (1 ora) | Tempo di vita cache |
| Tags | ['auto_permissions'] | Tag per cache group |
| Driver | Configurabile | Supporta tutti i driver Laravel |
Gestione Cache
class AutoPermissionsMiddleware
{
protected $cacheKey = 'route_permissions';
protected $cacheTtl = 3600; // 1 ora
// Cache con tag (Redis/Memcached)
if (method_exists(Cache::class, 'tags')) {
$cached = Cache::tags(['auto_permissions'])->get($optimizedCacheKey);
}
// Cache senza tag (Database/File)
else {
$cached = Cache::get($optimizedCacheKey);
}
}
Gestione Errori e Risposte
Utente Non Autenticato
Request JSON/API
{
"message": "You are not logged in.",
"required_permission": "shared.users.index"
}
Status Code: 403 Forbidden
Permesso Insufficiente
Request JSON/API
{
"message": "You do not have the necessary permissions.",
"required_permission": "shared.users.create"
}
Status Code: 403 Forbidden
Esempi Pratici di Utilizzo
Controller Base
#[AutoPermissions]
class UserController extends Controller
{
// GET api/users → Richiede: shared.users.index
public function index() {
return User::all();
}
// POST api/users → Richiede: shared.users.store
public function store(Request $request) {
return User::create($request->validated());
}
}
Controller con Configurazioni Avanzate
#[AutoPermissions(excludeMethods: ['health'])]
#[PermissionNaming(resourceName: 'admin_users', prefix: 'admin')]
class AdminUserController extends Controller
{
// GET api/admin/users/health → Nessun permesso richiesto
public function health() {
return ['status' => 'ok'];
}
// GET api/admin/users → Richiede: admin.admin_users.index
public function index() {
return User::with('roles')->get();
}
// DELETE api/admin/users/{id} → Richiede: admin.admin_users.destroy
public function destroy(User $user) {
$user->delete();
return response()->noContent();
}
}
Controller con Permessi Personalizzati
#[AutoPermissions]
class DocumentController extends Controller
{
// GET api/documents → Richiede: shared.documents.index
public function index() {
return Document::all();
}
// POST api/documents/bulk-download → Richiede: shared.documents.bulk_download
#[CustomPermission(action: 'bulk_download')]
public function downloadMultiple(Request $request) {
// Logica download multiplo
}
// GET api/documents/public → Nessun permesso richiesto
#[ExcludeFromPermissions(reason: 'Public document list')]
public function publicDocuments() {
return Document::where('public', true)->get();
}
}
Integrazione con Sistema Autorizzazioni Laravel
Verifica Permessi Utente
Il middleware utilizza il sistema di autorizzazione standard di Laravel:
// Il middleware verifica tramite:
$user->can($permission)
// Che si traduce internamente in:
Gate::allows($permission, $user)
Compatibilità con Spatie Permissions
Il sistema è completamente compatibile con Spatie Laravel Permission:
// I permessi generati possono essere assegnati normalmente
$user->givePermissionTo('shared.users.create');
$role->givePermissionTo('shared.users.index');
// E verificati dal middleware automaticamente
Performance e Ottimizzazioni
Ottimizzazioni Consigliate
1. Pre-warming della Cache
# Costruisci cache all'avvio
php artisan auto-permissions:cache build
2. Monitoring della Cache
# Verifica copertura cache
php artisan auto-permissions:cache status
Troubleshooting
Problemi Comuni
1. Permessi Non Riconosciuti
Sintomo: 403 anche con permessi corretti
# Verifica cache
php artisan auto-permissions:cache status
# Ricostruisci cache
php artisan auto-permissions:cache clear
php artisan auto-permissions:cache build
2. Controller Non Processato
Sintomo: Nessun permesso richiesto quando dovrebbe
// Verifica presenza attributo
#[AutoPermissions] // ← Deve essere presente
class MyController extends Controller { }
// O trait
class MyController extends Controller
{
use HasAutoPermissionsTrait; // ← Alternativa
}
3. Performance Lente
Sintomo: Richieste lente al primo accesso
# Pre-warm cache in deployment
php artisan auto-permissions:cache build
# Monitoring continuo
php artisan auto-permissions:cache status