JavaScript: scegliere le azioni in base al ruolo e ai permessi

by Anastasia P.
SHARE
JavaScript: scegliere le azioni in base al ruolo e ai permessi
© Guida-HTML5.it

Introduzione

Quando un’applicazione deve decidere quali operazioni può eseguire un utente, le strutture condizionali sono uno strumento essenziale. Un caso concreto è la gestione dei ruoli e dei permessi: un amministratore può modificare i dati, un moderatore può revisionare i contenuti, mentre un visitatore può soltanto consultarli.

In questo tutorial costruiremo una funzione JavaScript capace di determinare quali azioni sono disponibili in base al ruolo dell’utente e alla sezione richiesta. Utilizzeremo if, else e switch in modo complementare:

  • if sarà utile per controllare condizioni specifiche;
  • else gestirà il caso alternativo;
  • switch permetterà di confrontare chiaramente più ruoli o sezioni.

Questo esempio è utile in dashboard, pannelli amministrativi, sistemi di gestione documentale e API che devono autorizzare operazioni diverse senza duplicare la logica.

Codice completo

const utenti = [
  {
    nome: "Marta",
    ruolo: "admin",
    sezione: "utenti"
  },
  {
    nome: "Luca",
    ruolo: "moderator",
    sezione: "contenuti"
  },
  {
    nome: "Sara",
    ruolo: "viewer",
    sezione: "report"
  },
  {
    nome: "Paolo",
    ruolo: "guest",
    sezione: "impostazioni"
  }
];

function verificaPermessi(utente) {
  let azione;
  let messaggio;

  // switch confronta il ruolo con diversi casi possibili
  switch (utente.ruolo) {
    case "admin":
      // L´amministratore può accedere a tutte le sezioni
      azione = "accesso completo";
      messaggio = `Benvenuta ${utente.nome}: puoi gestire la sezione ${utente.sezione}.`;
      break;

    case "moderator":
      // Il moderatore può operare soltanto sui contenuti
      if (utente.sezione === "contenuti") {
        azione = "modifica contenuti";
        messaggio = `${utente.nome} può revisionare i contenuti.`;
      } else {
        azione = "accesso in sola lettura";
        messaggio = `${utente.nome} può consultare questa sezione, ma non modificarla.`;
      }
      break;

    case "viewer":
      // Un viewer può leggere i report, ma non modificarli
      if (utente.sezione === "report") {
        azione = "visualizzazione report";
        messaggio = `${utente.nome} può visualizzare i report.`;
      } else {
        azione = "accesso negato";
        messaggio = `${utente.nome} non può accedere a questa sezione.`;
      }
      break;

    default:
      // Caso di sicurezza per ruoli sconosciuti o non autenticati
      azione = "accesso negato";
      messaggio = "Ruolo non riconosciuto: operazione bloccata.";
  }

  return {
    utente: utente.nome,
    ruolo: utente.ruolo,
    sezione: utente.sezione,
    azione,
    messaggio
  };
}

for (const utente of utenti) {
  const risultato = verificaPermessi(utente);

  console.log({
    utente: risultato.utente,
    azione: risultato.azione,
    messaggio: risultato.messaggio
  });
}

Spiegazione

1. Rappresentare i dati dell’utente

Ogni oggetto dell’array utenti contiene tre proprietà: nome, ruolo e sezione. Separare questi dati rende la funzione riutilizzabile: possiamo passarle utenti diversi senza riscrivere la logica di autorizzazione.

2. Usare switch per i ruoli

La struttura switch è adatta quando dobbiamo confrontare una stessa espressione con diversi valori. In questo caso controlliamo utente.ruolo. Ogni blocco case descrive un comportamento:

  • admin: accesso completo;
  • moderator: controllo più specifico sulla sezione;
  • viewer: accesso limitato;
  • default: comportamento sicuro per valori sconosciuti.

La parola chiave break interrompe l’esecuzione del blocco corrente. Senza break, JavaScript continuerebbe nei casi successivi, provocando il cosiddetto fall-through.

3. Inserire if ed else nei casi complessi

Nel caso del moderatore non basta controllare il ruolo: dobbiamo verificare anche la sezione. Qui entra in gioco if:

if (utente.sezione === "contenuti") {
  // Permesso specifico
} else {
  // Comportamento alternativo
}

L’operatore === confronta valore e tipo, evitando conversioni automatiche. È preferibile a == nella maggior parte dei casi perché rende le condizioni più prevedibili.

4. Gestire il default

Il ramo default non deve essere considerato un dettaglio secondario. In un sistema reale possono arrivare ruoli scritti male, dati incompleti o valori manipolati. Negare l’accesso in caso di ruolo sconosciuto segue il principio di sicurezza fail closed: quando qualcosa non è riconosciuto, l’operazione viene bloccata.

Best practice

  • Usa nomi espliciti: ruolo, sezione e azione spiegano immediatamente lo scopo dei dati.
  • Confronta con ===: evita risultati inattesi dovuti alla conversione implicita dei tipi.
  • Inserisci sempre un default: gestisce valori non previsti e migliora la sicurezza.
  • Non confondere interfaccia e sicurezza: nascondere un pulsante nel browser non protegge davvero un’operazione. I permessi devono essere verificati anche sul server.
  • Riduci la complessità: se uno switch diventa molto lungo, valuta una struttura dati o funzioni separate per ogni ruolo.
  • Normalizza gli input: prima del confronto puoi usare trim() e toLowerCase() se i dati provengono dall’utente.
const ruoloNormalizzato = ruolo.trim().toLowerCase();

if (ruoloNormalizzato === "admin") {
  console.log("Accesso amministrativo");
} else {
  console.log("Accesso standard");
}

Riepilogo

Le strutture condizionali permettono di trasformare regole di autorizzazione in codice leggibile e organizzato. switch è particolarmente efficace per distinguere più ruoli, mentre if ed else permettono di aggiungere controlli più precisi all’interno di ogni caso.

Un buon sistema deve prevedere anche valori imprevisti, usare confronti rigorosi e applicare una politica sicura per gli accessi non riconosciuti. Ricorda inoltre che il codice JavaScript eseguito nel browser non è sufficiente per proteggere dati o operazioni importanti: la verifica definitiva deve essere effettuata dal backend.

Approfondisci con risorse ufficiali

SHARE