Italiano
  • rbac
  • disegno del ruolo
  • implementazione rbac

RBAC in pratica: Implementare un'autorizzazione sicura per la tua applicazione

Guida completa al Controllo di Accesso Basato su Ruoli (RBAC): padroneggiare la progettazione dei permessi, la gestione dei ruoli e l'autorizzazione sicura con un'implementazione pratica CMS.

Yijun
Yijun
Developer

Smetti di sprecare settimane sull'autenticazione degli utenti
Lancia app sicure più velocemente con Logto. Integra l'autenticazione degli utenti in pochi minuti e concentrati sul tuo prodotto principale.
Inizia ora
Product screenshot

Hai difficoltà a implementare un sistema di autorizzazione sicuro e scalabile per la tua applicazione? Il Controllo di Accesso Basato su Ruoli (RBAC) è lo standard del settore per gestire i permessi degli utenti, ma implementarlo correttamente può essere una sfida. Questo tutorial ti mostrerà come costruire un sistema RBAC robusto utilizzando un esempio reale di Sistema di Gestione dei Contenuti (CMS).

Seguendo questa guida, imparerai:

  • ✨ Come progettare e implementare permessi dettagliati che ti diano un controllo preciso
  • 🔒 Best practices per organizzare i permessi in ruoli significativi
  • 👤 Tecniche per gestire efficacemente la proprietà delle risorse
  • 🚀 Modi per rendere il tuo sistema di autorizzazione scalabile e manutenibile
  • 💡 Implementazione pratica utilizzando un esempio reale di CMS

Il codice sorgente completo di questo tutorial è disponibile su GitHub.

Comprendere i fondamenti di RBAC

Il Controllo di Accesso Basato su Ruoli è più di un semplice assegnare permessi agli utenti. Si tratta di creare un approccio strutturato all'autorizzazione che bilancia sicurezza e manutenibilità.

Puoi saperne di più su Cosa è RBAC nel Wiki dell'autenticazione.

Ecco i principi chiave che seguiremo nella nostra implementazione:

Progettazione di permessi dettagliati

I permessi dettagliati ti danno un controllo preciso su ciò che gli utenti possono fare nel tuo sistema. Invece di livelli di accesso ampi come "admin" o "utente", definiamo azioni specifiche che gli utenti possono eseguire sulle risorse. Per esempio:

  • read:articles - Visualizzare qualsiasi articolo nel sistema
  • create:articles - Creare nuovi articoli
  • update:articles - Modificare gli articoli esistenti
  • publish:articles - Modificare lo stato di pubblicazione degli articoli

Proprietà delle risorse e controllo degli accessi

La proprietà delle risorse è un concetto fondamentale nel design dell'autorizzazione del nostro CMS. Mentre l'RBAC definisce quali azioni possono eseguire diversi ruoli, la proprietà aggiunge una dimensione personale al controllo degli accessi:

  • Gli autori hanno automaticamente accesso agli articoli che hanno creato
  • Questo modello di proprietà naturale significa che gli autori possono sempre visualizzare e modificare i propri contenuti
  • Il sistema controlla sia i permessi di ruolo O la proprietà quando si gestiscono le operazioni sugli articoli
  • Per esempio, anche senza il permesso update:articles, un autore può ancora modificare i propri articoli
  • Questo design riduce la necessità di permessi di ruolo extra mantenendo la sicurezza

Questo approccio a due livelli (ruoli + proprietà) crea un sistema più intuitivo e sicuro. Editori e amministratori possono comunque gestire tutti i contenuti attraverso i loro permessi di ruolo, mentre gli autori mantengono il controllo sul loro lavoro.

Progettazione di API sicure

Iniziamo progettando le funzionalità core del nostro CMS tramite i suoi endpoint API:

Implementare il controllo degli accessi per la tua API

Per ogni endpoint, dobbiamo considerare due aspetti del controllo degli accessi:

  1. Proprietà della risorsa - L'utente possiede questa risorsa?
  2. Permessi basati sui ruoli - Il ruolo dell'utente consente questa operazione?

Ecco come gestiremo l'accesso per ogni endpoint:

EndpointLogica di controllo degli accessi
GET /api/articles- Chiunque con il permesso list:articles, O gli autori possono vedere i propri articoli
GET /api/articles/:id- Chiunque con il permesso read:articles, O l'autore dell'articolo
POST /api/articles- Chiunque con il permesso create:articles
PATCH /api/articles/:id- Chiunque con il permesso update:articles, O l'autore dell'articolo
DELETE /api/articles/:id- Chiunque con il permesso delete:articles, O l'autore dell'articolo
PATCH /api/articles/:id/published- Solo utenti con il permesso publish:articles

Creare un sistema di permessi che si adatta

In base ai nostri requisiti di accesso API, possiamo definire questi permessi:

PermessoDescrizione
list:articlesVisualizza l'elenco di tutti gli articoli nel sistema
read:articlesLeggi il contenuto completo di qualsiasi articolo
create:articlesCrea nuovi articoli
update:articlesModifica qualsiasi articolo
delete:articlesElimina qualsiasi articolo
publish:articlesCambia lo stato di pubblicazione

Nota che questi permessi sono necessari solo quando si accede a risorse che non possiedi. I proprietari degli articoli possono automaticamente:

  • Visualizzare i propri articoli (non è necessario read:articles)
  • Modificare i propri articoli (non è necessario update:articles)
  • Eliminare i propri articoli (non è necessario delete:articles)

Costruire ruoli efficaci

Ora che abbiamo definito le nostre API e i permessi, possiamo creare ruoli che raggruppano questi permessi logicamente:

Permesso/Ruolo👑 Admin📝 Publisher✍️ Author
DescrizioneAccesso completo al sistema per la gestione totale dei contenutiPuò visualizzare tutti gli articoli e controllare lo stato di pubblicazionePuò creare nuovi articoli nel sistema
list:articles
read:articles
create:articles
update:articles
delete:articles
publish:articles

Nota: Gli autori hanno automaticamente i permessi di lettura/modifica/eliminazione per i propri articoli, indipendentemente dai permessi di ruolo.

Ogni ruolo è progettato con specifiche responsabilità in mente:

  • Admin: Ha il controllo completo sul CMS, comprese tutte le operazioni sugli articoli
  • Editore: Si concentra sulla revisione dei contenuti e sulla gestione della pubblicazione
  • Autore: Si specializza nella creazione di contenuti

Questa struttura dei ruoli crea una chiara separazione delle preoccupazioni:

  • Gli autori si concentrano sulla creazione di contenuti
  • Gli editori gestiscono la qualità e la visibilità dei contenuti
  • Gli amministratori mantengono il controllo generale del sistema

Configurare RBAC in Logto

Prima di iniziare, devi creare un account su Logto Cloud, oppure puoi utilizzare un'istanza auto-ospitata di Logto usando la versione OSS di Logto.

Ma per questo tutorial, useremo Logto Cloud per semplicità.

Impostare la tua applicazione

  1. Vai alla sezione "Applicazioni" nel Logto Console per creare una nuova applicazione react
    • Nome dell'applicazione: Sistema di Gestione dei Contenuti
    • Tipo di applicazione: Applicazione Web Tradizionale
    • URI di reindirizzamento: http://localhost:5173/callback

Applicazione React CMS

Configurazione delle risorse e dei permessi API

  1. Vai alla sezione "Risorse API" nel Logto Console per creare una nuova risorsa API
    • Nome API: CMS API
    • Identificatore API: https://api.cms.com
    • Aggiungi permessi alla risorsa API
      • list:articles
      • read:articles
      • create:articles
      • update:articles
      • publish:articles
      • delete:articles

Dettagli della risorsa API CMS

Creare ruoli

Vai ai Ruoli nel Logto Console per creare i seguenti ruoli per il CMS

  • Admin
    • con tutti i permessi
  • Publisher
    • con read:articles, list:articles, publish:articles
  • Author
    • con create:articles

Ruolo Admin

Ruolo Publisher

Ruolo Author

Assegnare ruoli agli utenti

Vai alla sezione "Gestione utenti" nel Logto Console per creare utenti.

Nella tab "Ruoli" dei dettagli utente, puoi assegnare ruoli all'utente.

Nel nostro esempio, creiamo 3 utenti con i seguenti ruoli:

  • Alex: Admin
  • Bob: Publisher
  • Charlie: Author

Gestione utenti

Dettagli utente - Alex

Integrare il tuo frontend con Logto RBAC

Ora che abbiamo configurato RBAC in Logto, possiamo iniziare a integrarlo nel nostro frontend.

Innanzitutto, segui le Guide Rapide di Logto per integrare Logto nella tua applicazione.

Nel nostro esempio, usiamo React per la dimostrazione.

Dopo aver configurato Logto nella tua applicazione, dobbiamo aggiungere le configurazioni RBAC per far funzionare Logto.

Ricorda di disconnetterti e accedere nuovamente per far sì che questa modifica abbia effetto se sei già connesso.

Quando l'utente accede con Logto e richiede un token di accesso per le risorse API specificate sopra, Logto aggiungerà ambiti (permessi) relativi al ruolo dell'utente al token di accesso.

Puoi utilizzare getAccessTokenClaims dall'hook useLogto per ottenere gli ambiti dal token di accesso.

E puoi utilizzare userScopes per verificare se l'utente ha il permesso di accedere alla risorsa.

Integrare il tuo backend con Logto RBAC

Ora, è il momento di integrare Logto RBAC nel tuo backend.

Middleware di autorizzazione del backend

Innanzitutto, dobbiamo aggiungere un middleware nel backend per controllare i permessi degli utenti, verificare se l'utente è loggato e determinare se hanno i permessi necessari per accedere a determinate API.

Come puoi vedere, in questo middleware, verifichiamo se la richiesta frontend contiene un token di accesso valido e controlliamo se l'audience del token di accesso corrisponde alla risorsa API che abbiamo creato nel Logto Console.

Il motivo per verificare la risorsa API è che la nostra risorsa API rappresenta in realtà le risorse del nostro backend CMS, e tutti i nostri permessi CMS sono associati a questa risorsa API.

Poiché questa risorsa API rappresenta le risorse CMS in Logto, nel nostro codice frontend, includiamo il corrispondente token di accesso quando facciamo richieste API al backend:

Ora possiamo usare il middleware requireAuth per proteggere i nostri endpoint API.

Protezione degli endpoint API

Per le API che dovrebbero essere accessibili solo agli utenti con permessi specifici, possiamo aggiungere restrizioni direttamente nel middleware. Per esempio, l'API di creazione degli articoli dovrebbe essere accessibile solo agli utenti con il permesso create:articles:

Per API che devono controllare sia i permessi che la proprietà delle risorse, possiamo utilizzare la funzione hasScopes. Per esempio, nell'API di elencazione degli articoli, gli utenti con il permesso list:articles possono accedere a tutti gli articoli, mentre gli autori possono accedere ai propri articoli creati:

A questo punto, abbiamo completato l'implementazione di RBAC. Puoi controllare il codice sorgente completo per vedere l'implementazione completa.

Testare l'implementazione RBAC CMS

Ora, testiamo la nostra implementazione RBAC CMS utilizzando i tre utenti che abbiamo appena creato.

Innanzitutto, accediamo rispettivamente come Alex e Charles e creiamo alcuni articoli.

Poiché Alex ha il ruolo Admin, può creare, eliminare, aggiornare, pubblicare e visualizzare tutti gli articoli.

Dashboard CMS - Alex

Charlie, avendo il ruolo Author, può solo creare i propri articoli e può solo visualizzare, aggiornare ed eliminare gli articoli di cui è proprietario.

Dashboard CMS - Charles - Elenco Articoli

Bob, con il ruolo Publisher, può visualizzare e pubblicare tutti gli articoli ma non può crearli, aggiornarli o eliminarli.

Dashboard CMS - Bob

Conclusione

Congratulazioni! Hai appreso come implementare un robusto sistema RBAC nella tua applicazione.

Per scenari più complessi, come costruire applicazioni multi-tenant, Logto fornisce un supporto organizzativo completo. Consulta la nostra guida Costruire un'applicazione SaaS multi-tenant: Una guida completa dal design all'implementazione per saperne di più sull'implementazione del controllo degli accessi a livello organizzativo.

Buona programmazione! 🚀