Skip to main content

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

  1. Estrazione Route: Il middleware estrae informazioni dalla route corrente
  2. Cache Check: Verifica se il permesso è già in cache
  3. Calcolo Permesso: Se non in cache, calcola il permesso necessario
  4. Verificazione Utente: Controlla se l'utente autenticato ha il permesso
  5. 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

  1. Parsing Action: Estrae modulo, controller e metodo dalla stringa action
  2. Controllo Attributi: Verifica attributi di personalizzazione sul controller
  3. Naming Resolution: Risolve il nome finale del permesso
  4. 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

ParametroValoreDescrizione
TTL3600 secondi (1 ora)Tempo di vita cache
Tags['auto_permissions']Tag per cache group
DriverConfigurabileSupporta 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