Hai descritto la tua applicazione a un agente AI, hai visto l’interfaccia renderizzarsi in pochi secondi e hai effettuato l’accesso con successo alla tua nuova dashboard. Sembra una vittoria incredibile. Inviti i tuoi primi dieci clienti e tutto sembra perfetto. Ma dietro i bellissimi componenti React e le fluide animazioni Tailwind, potrebbe nascondersi un disastro silenzioso.
Costruire un portale clienti è fondamentalmente diverso dal creare una directory pubblica o una semplice web app. In un portale clienti, l’isolamento dei dati è l’unica funzionalità che conta davvero. Se un cliente può accedere alle proprie fatture, non dovrebbe mai poter vedere quelle di un altro cliente.
Molti builder usano generatori di codice AI per impostare la struttura di questi portali, affidandosi all’AI per configurare backend come Supabase. Ma affidarsi all’AI per scrivere le policy di Row-Level Security (RLS) è una scorciatoia che spesso porta alla fuga di dati.
Ecco perché la sicurezza del database generata dall’AI è fragile e come gli schemi di permessi visivi offrano un percorso più affidabile per i portali clienti.
L’illusione della sicurezza frontend
Quando costruite con assistenti AI, questi tendono a scrivere codice che privilegia il feedback visivo. L’AI nasconde un pulsante se l’utente non è un amministratore, o nasconde una lista di record se l’email dell’utente non corrisponde a quella del record.
Questa è sicurezza lato frontend, ed è totalmente inutile se usata da sola.
Chiunque abbia un browser può aprire gli strumenti per sviluppatori, cliccare sulla scheda network e ispezionare i payload JSON in entrata. Se la tua applicazione recupera tutti i record dei clienti dal database e li filtra nel frontend usando React o Vue, i tuoi dati sono già esposti. Un utente malintenzionato non ha bisogno di hackerare il server - gli basta premere F12 per vedere i dati grezzi che il codice del tuo frontend cercava di nascondere.
Per costruire un portale sicuro, devi filtrare i dati a livello di database prima che transitino sulla rete. Se un cliente richiede l’elenco dei progetti, il motore del database deve ispezionare la sessione, verificare l’identità e restituire solo le righe corrispondenti.
Per i progetti realizzati su Supabase, questa sicurezza del database si affida interamente alla Row-Level Security (RLS) di PostgreSQL.
Le vulnerabilità della Supabase RLS generata dall’IA
Supabase è un’ottima scelta di backend per le app personalizzate, ma sposta l’onere della sicurezza sulla configurazione del database. L’impostazione della RLS richiede la scrittura di policy PostgreSQL precise utilizzando SQL.
Quando chiedi a un AI builder di gestire questo aspetto, introduci diversi punti di vulnerabilità.
1. Deriva della finestra di contesto e complessità delle relazioni
Una policy RLS semplice è facile da scrivere. Se un utente possiede una riga, può leggerla. Basta scrivere una regola che verifichi se auth.uid() = user_id.
Ma i portali per i clienti raramente sono così semplici. Di solito ci sono organizzazioni, team, collaboratori esterni e diversi ruoli. Un progetto potrebbe appartenere a un’organizzazione, e un utente è un membro di quell’organizzazione con un ruolo specifico. Per verificare se un utente può leggere il record di un progetto, il database deve interrogare una tabella di giunzione.
Man mano che lo schema del database cresce, l’IA deve tenere traccia di tutte queste relazioni. Nel momento in cui chiedi all’IA una nuova funzionalità, può verificarsi la cosiddetta context window drift. L’IA potrebbe scrivere una nuova query che bypassa la logica RLS esistente o semplificare la policy per far funzionare il codice, aprendo l’accesso a utenti non autorizzati.
2. Fallimenti silenziosi nella logica SQL
Le policy di PostgreSQL falliscono silenziosamente. Se scrivi una policy errata, PostgreSQL non blocca l’app. O blocca tutto l’accesso o, se configurata male, permette a chiunque di leggere i dati.
I modelli di IA commettono spesso errori sottili con i valori null di SQL o la logica booleana. Ad esempio, una policy come questa:
create policy "Users can view company data" on companies
for select using (
auth.uid() in (select user_id from members where company_id = id)
or public_access = true
);
Se il motore del database valuta public_access come null, o se la sottoquery restituisce null in modo imprevisto, la policy potrebbe risultare vera per tutti gli utenti autenticati. Un’IA potrebbe generare questo codice perché sintatticamente sembra corretto, ma manca della gestione dei casi limite necessaria per gli ambienti di produzione reali.
3. Il gap dei test
Gli sviluppatori professionisti non si limitano a scrivere policy RLS; scrivono suite di test per verificarle. Usano strumenti come pgTAP per simulare diverse sessioni utente e confermare che un cliente non possa interrogare i dati di un altro.
I generatori di codice IA non scrivono questi test a meno che tu non lo richieda esplicitamente, e anche in quel caso, eseguire test di sicurezza a livello di database in un ambiente generato dall’IA è complesso. Senza suite di test automatizzate, stai solo tirando a indovinare se le tue policy siano sicure. Te ne accorgerai solo quando un cliente ti chiamerà per chiederti perché vede la dashboard di un’altra azienda.
Schemi di permessi visuali: l’alternativa no-code
Se non vuoi fare l’audit del codice PostgreSQL o gestire suite di test, hai bisogno di un paradigma di sicurezza diverso. Gli schemi di permessi visuali, come quelli usati in Softr, sostituiscono il codice personalizzato del database con regole strutturate e imposte dalla piattaforma.
Invece di scrivere istruzioni SQL per filtrare le righe, configuri le tue regole di accesso utilizzando un pannello di impostazioni visuale.
Mapping visuale vs scripting SQL
Mentre le configurazioni tradizionali richiedono la scrittura di policy di database personalizzate, i builder moderni si affidano a impostazioni visuali. In Softr, definisci i gruppi di utenti in base agli attributi del database. Per esempio, puoi creare un gruppo chiamato “Utenti Portale Clienti” dove l’ID dell’azienda corrisponde all’ID dell’azienda dell’utente collegato.
Una volta definiti, applichi questi gruppi direttamente a pagine, blocchi e azioni. La piattaforma gestisce automaticamente il routing del backend e le query del database. Il blocco nel frontend non riceve l’intero set di dati; al contrario, il server filtra la sorgente dati prima di renderizzare il blocco.
Database nativamente sicuri
Quando usi i database di Softr come livello di dati nativo, la sicurezza a livello di riga è integrata nella connessione fin dall’inizio. Non scrivi regole di sicurezza direttamente sulle tabelle del database - non c’è SQL generato da revisionare, non ci sono script di migrazione da eseguire e nessuna policy da mantenere. Il livello di integrazione limita l’accesso alle query per impostazione predefinita, quindi non c’è codice generato che possa divergere, rompersi o esporre accidentalmente i record dopo un cambio di schema.
Se a un gruppo di utenti è permesso leggere solo i record in cui lo stato è “Attivo” e il campo cliente corrisponde al loro account, il motore dell’interfaccia applica questo filtro a livello di query. Il cliente non può manipolare la richiesta API per recuperare record inattivi o righe di altri clienti perché il server backend ignora i parametri non autorizzati.
Softr si collega inoltre a oltre 17 sorgenti esterne - inclusi Airtable e Google Sheets - se hai bisogno di importare dati che gestisci già altrove. Le stesse regole visuali per i gruppi di utenti si applicano a prescindere da dove risiedano i dati.
L’onere della manutenzione del codice generato
Costruire un portale clienti non è un evento unico. Le tue regole di business cambieranno. Aggiungerai nuovi livelli di clientela, introdurrai strutture di progetto annidate o cambierai il modo in cui gli amministratori revisionano i documenti inviati.
In un’applicazione a codice generato costruita con strumenti come Bolt o Lovable, ogni modifica del layout o aggiornamento delle relazioni richiede il refactoring dello schema del database e la riscrittura delle policy di sicurezza. Ti affidi all’IA per:
- Leggere l’intero codebase per comprendere lo schema esistente.
- Generare uno script di migrazione senza danneggiare i dati esistenti.
- Riscrivere le regole RLS per adattarle alle nuove relazioni.
- Aggiornare il frontend React per passare gli header e i token corretti.
Questo è il problema del “Giorno Due”. Un singolo prompt può rompere una policy di sicurezza precedentemente funzionante, e potresti non accorgertene finché il codice non è già stato distribuito in produzione.
Con Softr, apporti queste modifiche senza toccare il codice. Puoi usare l’AI Co-Builder per descrivere la modifica di cui hai bisogno - “aggiungi un gruppo utenti Manager che possa approvare l’invio dei progetti” - e lui aggiornerà contemporaneamente gruppi utenti, pagine e permessi. Oppure puoi effettuare la modifica manualmente nel pannello delle impostazioni se preferisci. In entrambi i casi, non c’è SQL generato da revisionare e nessun rischio che una regressione della policy di sicurezza finisca silenziosamente in produzione.
Best practice di sicurezza per il tuo portale clienti
Se stai costruendo un portale che gestisce dati aziendali sensibili, tieni a mente queste linee guida:
Smetti di fare affidamento sui filtri frontend
Non presumere mai che i dati siano sicuri solo perché sono nascosti nell’interfaccia utente. Verifica sempre che la tua API di backend o la sorgente dati filtri le informazioni prima che vengano inviate. Se la tua piattaforma non supporta il filtraggio sicuro lato backend, non usarla per i portali clienti.
Mantieni semplici i ruoli utente
Evita gerarchie di permessi eccessivamente complesse. Se i tuoi permessi sono troppo complicati perché un essere umano possa revisionarli facilmente, l’IA farà fatica a scriverli correttamente. Attieniti a gruppi utenti chiari e distinti, come Admin, Manager e Clienti.
Scegli strumenti strutturati per il software operativo
I generatori di codice IA sono ottimi per la validazione, il prototipazione e la creazione di interfacce SaaS per i consumatori. Ma quando il tuo requisito primario è la sicurezza operativa, l’isolamento dei dati e la stabilità a lungo termine, una piattaforma no-code strutturata è la scelta più sicura.
Sfruttando una piattaforma che isola le configurazioni di sicurezza dal codice del layout, garantisci che gli aggiornamenti di stile non espongano mai accidentalmente il tuo database a internet. Otterrai un portale professionale e sicuro su fondamenta prevedibili, permettendoti di concentrarti sui tuoi clienti invece di fare il debug delle policy del database.