Ruoli e Permessi (RBAC)
Auris implementa il controllo degli accessi basato sui ruoli (RBAC) con un modello di risoluzione dei permessi a tre stati: i permessi possono essere esplicitamente ALLOW (consentiti), esplicitamente DENY (negati) o INHERIT (ereditati dal default del ruolo). Le sovrascritture a livello utente hanno precedenza sui permessi a livello di ruolo, consentendo eccezioni granulari senza dover creare ruoli dedicati.
Formato dei Permessi
Tutti i permessi in Auris seguono il pattern azione:risorsa:
manage:users view:invoices create:tickets
edit:roles approve:expenses delete:documents
assign:tickets sign:interventions export:reportsIl componente azione descrive cosa abilita il permesso. Azioni comuni: view, create, edit, delete, manage, approve, assign, export, sign, generate.
Il componente risorsa descrive l’entità o funzionalità a cui si accede. Le risorse corrispondono ai moduli della tua applicazione.
Esiste un permesso speciale — admin:all — che concede accesso illimitato a tutte le risorse. È assegnato al ruolo Amministratore predefinito.
Creare Ruoli
Tramite la Console
- Vai su Console → Ruoli → Crea Ruolo
- Inserisci un nome (es.
Responsabile Fatture), una descrizione opzionale e scegli un colore per il badge del ruolo - Il ruolo viene creato senza permessi. Configurali nella pagina di dettaglio del ruolo.
Tramite API
/api/rolesRequires: manage:rolesCrea un nuovo ruolo. Corpo: { name: string, description?: string, color?: string }.
// Usando il Management Client di Auris
const management = await createManagementClient({ ... })
const role = await management.roles.create({
name: 'Responsabile Fatture',
description: 'Può creare e visualizzare le fatture ma non eliminarle',
color: '#3b82f6',
})Configurare i Permessi
Categorie di Permessi
L’editor dei permessi nella Console organizza i permessi in 10 categorie:
| Categoria | Permessi di Esempio |
|---|---|
| Documenti | view:invoices, create:quotes, approve:expenses, sign:interventions |
| Utenti | view:users, manage:users, import:users, export:users |
| Ruoli | view:roles, manage:roles, assign:roles |
| Applicazioni | view:applications, manage:applications, manage:api_keys |
| Organizzazioni | view:organizations, manage:organizations, manage:sso_connections |
| Sicurezza | view:audit_logs, manage:attack_protection, view:sessions |
| Fatturazione | view:billing, manage:subscriptions |
| Integrazioni | view:integrations, manage:webhooks, manage:automations |
| Infrastruttura | view:monitoring, manage:devices, manage:firewalls |
| Supporto | view:tickets, create:tickets, assign:tickets, manage:sla |
Impostare i Permessi su un Ruolo
Nella Console, ogni permesso ha un toggle a tre posizioni nella pagina di dettaglio del ruolo:
- ALLOW — Il permesso è concesso agli utenti con questo ruolo
- DENY — Il permesso è esplicitamente negato, sovrascrivendo qualsiasi ALLOW ereditato da altri ruoli
- INHERIT — Il ruolo non concede né nega questo permesso (default)
Un utente ottiene un permesso se almeno uno dei suoi ruoli lo ha impostato su ALLOW e nessuno dei suoi ruoli lo ha impostato su DENY.
Tramite API
/api/roles/:id/permissionsRequires: manage:rolesAggiorna i permessi di un ruolo. Corpo: { permissions: { [permission: string]: 'ALLOW' | 'DENY' | 'INHERIT' } }.
Assegnare Ruoli agli Utenti
I ruoli si assegnano agli utenti nella Console (Utenti → [Utente] → scheda Ruoli) o tramite API:
/api/users/:id/rolesRequires: manage:usersAssegna uno o più ruoli a un utente. Corpo: { roleIds: string[] }.
/api/users/:id/roles/:roleIdRequires: manage:usersRimuovi un ruolo da un utente.
Gli utenti possono avere più ruoli. I permessi di tutti i ruoli vengono uniti. Se un ruolo ha DENY per un permesso, questo sovrascrive il ALLOW di altri ruoli.
Sovrascritture dei Permessi a Livello Utente
I singoli utenti possono avere permessi impostati direttamente, indipendentemente dai loro ruoli. Le sovrascritture utente hanno precedenza su tutti i permessi dei ruoli:
- Un ALLOW a livello utente concede il permesso anche se nessun ruolo lo concede
- Un DENY a livello utente blocca il permesso anche se un ruolo concede ALLOW
Console: Utenti → [Utente] → scheda Permessi → Aggiungi Sovrascrittura
/api/users/:id/permission-overridesRequires: manage:usersImposta una sovrascrittura di permesso per un utente specifico. Corpo: { permission: string, effect: 'ALLOW' | 'DENY' }.
Verificare i Permessi
Lato Server (Route API)
Usa il helper requirePermission() per applicare i permessi nelle route API:
Next.js Route Handler
// app/api/invoices/route.ts
import { requirePermission } from '@auris/nextjs/server'
const config = {
domain: process.env.NEXT_PUBLIC_AURIS_DOMAIN!,
clientId: process.env.NEXT_PUBLIC_AURIS_CLIENT_ID!,
}
export const GET = requirePermission('view:invoices', config, async (req, { session }) => {
// Raggiunto solo se l'utente ha il permesso view:invoices
const invoices = await getInvoices(session.user.id)
return Response.json(invoices)
})
export const POST = requirePermission('create:invoices', config, async (req, { session }) => {
const body = await req.json()
const invoice = await createInvoice(body, session.user.id)
return Response.json(invoice, { status: 201 })
})Lato Client (Componenti React)
React Hook
import { useCheckPermission, usePermissions } from '@auris/react'
// Verifica un singolo permesso
function InvoiceActions() {
const { allowed: canCreate, isLoading } = useCheckPermission('create:invoices')
const { allowed: canDelete } = useCheckPermission('delete:invoices')
if (isLoading) return null
return (
<div>
{canCreate && <button>Nuova Fattura</button>}
{canDelete && <button>Elimina Selezionate</button>}
</div>
)
}
// Verifica più permessi contemporaneamente
function DashboardNav() {
const { has, hasAll, hasAny } = usePermissions([
'view:invoices',
'view:quotes',
'manage:users',
'view:billing',
])
return (
<nav>
{has('view:invoices') && <a href="/invoices">Fatture</a>}
{has('view:quotes') && <a href="/quotes">Preventivi</a>}
{has('manage:users') && <a href="/users">Utenti</a>}
{has('view:billing') && <a href="/billing">Fatturazione</a>}
{hasAll(['view:invoices', 'view:quotes']) && <a href="/documents">Tutti i Documenti</a>}
{hasAny(['manage:users', 'manage:roles']) && <a href="/it/admin">Admin</a>}
</nav>
)
}API dei Permessi
/api/roles/checkVerifica uno o più permessi per l’utente autenticato. Corpo: { permissions: string[] } o { permission: string }. Restituisce un array di oggetti { permission, allowed }.
/api/rolesRequires: view:rolesElenca tutti i ruoli del tenant, inclusi conteggi di permessi e utenti.
/api/roles/:idRequires: view:rolesOttieni un ruolo specifico incluso il suo set completo di permessi.
/api/roles/:idRequires: manage:rolesElimina un ruolo. Gli utenti che avevano questo ruolo perdono immediatamente i permessi associati.
Ordine di Risoluzione dei Permessi
Quando Auris risolve se un utente ha un permesso specifico, segue questo ordine di precedenza:
- DENY a livello utente — Se presente, il permesso è negato. Nessuna ulteriore valutazione.
- ALLOW a livello utente — Se presente (e nessun DENY), il permesso è concesso.
- Permessi dei ruoli — Se almeno un ruolo ha ALLOW e nessun ruolo ha DENY, il permesso è concesso.
- Negazione implicita — Se nessuna regola concede il permesso, è negato.
DENY sovrascrittura utente → NEGATO (si ferma qui)
ALLOW sovrascrittura utente → CONCESSO (si ferma qui)
DENY di qualsiasi ruolo → NEGATO (si ferma qui)
ALLOW di qualsiasi ruolo → CONCESSO
Nessuna corrispondenza → NEGATOPermessi con Scope per Applicazione
I permessi possono facoltativamente avere scope per un’applicazione specifica. Quando un applicationId è incluso nella verifica di un permesso, Auris valuta i permessi nel contesto di quell’applicazione — utile per tenant multi-applicazione dove i ruoli possono differire per applicazione.
const result = await fetch('/api/roles/check', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
permissions: ['view:invoices', 'create:invoices'],
applicationId: 'app-id-per-app-fatturazione',
}),
})Guide Correlate
- Autorizzazione Granulare (FGA) — Controllo degli accessi a livello di oggetto oltre ai ruoli
- Claim JWT Personalizzati — Incorpora dati di ruoli e permessi negli access token
- Client Credentials M2M — Autorizzazione per chiamate server-to-server