Nelle applicazioni Laravel multi-mandante lo scope globale è lo strumento preferito: ogni query di un modello riceve automaticamente la condizione per il mandante attuale. Questo protegge bene la lettura. Tre punti però sfuggono.
1. Validazione con exists e unique
Le regole exists e unique interrogano direttamente il database, senza Eloquent. Un modulo può così rimandare a un record di un altro mandante e la validazione non segnala errori. Rimedio: una regola propria che verifica sempre il mandante — e un test che prova con un id estraneo.
2. Modelli senza scope
Un contesto di mandante impostato non è un filtro se il modello non porta lo scope — spesso il modello degli utenti. Chi chiede «tutti gli utenti di questa azienda» ottiene allora tutti gli utenti. Rimedio: mettere le eccezioni in uno scope con nome e testare sempre gli elenchi con un secondo mandante che non deve ricevere nulla.
3. Ordine dei middleware
Se il binding delle rotte avviene prima del middleware che imposta il mandante, Laravel trova record estranei e la policy risponde 403 invece di 404. Già questo rivela che il record esiste. Rimedio: anteporre il mandante al binding tramite la priorità dei middleware e testare «estraneo dà 404» in ogni modulo.
Ciò che i tre casi hanno in comune: un test con un solo mandante non vede alcuna falla. Solo il secondo mandante la rende visibile.