# Utenti, gruppi e permessi in OpenPlatform

> Come un utente raggiunge un’applicazione in OpenPlatform: i gruppi decidono quali applicazioni vede l’utente e quali valori di permesso riceve ogni applicazione.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: it
Content-SHA256: 180c614093738c22685e00e104b746a37ee121c20bc4660006cb56599561731d
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

OpenPlatform separa **chi** (utenti), **dove** (applicazioni) e **cosa** (permessi) con i gruppi nel mezzo:

- Un **utente** ha un nome, un’e-mail, una lingua, una password e dei flag (`sa` per l’amministratore, `isconfirmed`, `isdisabled`, `isinactive`, `notifications`, `sounds`...) e appartiene a un numero qualsiasi di gruppi (schema `@User`, `plugins/setup/schemas/users.js`).
- Un **gruppo** ha un nome, un colore, un’icona, un `reference` facoltativo e un elenco di permessi (schema `@Group`, `plugins/setup/schemas/groups.js`).
- Un’**applicazione** dichiara i propri permessi: ognuno ha un nome e un `value`, una semplice stringa che l’applicazione comprende (`plugins/setup/schemas/apps.js`).

## Come viene calcolato l’accesso

La funzione `FUNC.permissions(userid, callback)` in `definitions/func.js` costruisce, per un utente:

1. i gruppi dell’utente che non sono disabilitati;
2. le righe di `tbl_group_permission` di quei gruppi: una riga con un permesso concede quel permesso di un’applicazione, e una riga **senza** permesso concede solo l’applicazione (l’utente la vede e riceve un elenco di permessi vuoto);
3. il `value` di ogni permesso concesso, solo per le applicazioni non rimosse e non disabilitate.

Il risultato ha tre parti: le applicazioni dell’utente (`apps`), i valori dei permessi per applicazione (`permissions`) e i gruppi (`groups`). Viene memorizzato come JSON nella colonna `cache` dell’utente, con un `cachefilter` che elenca i gruppi (`G<id>`) e le applicazioni (`A<id>`) da cui dipende. Quando cambia un gruppo o un’applicazione, `FUNC.clearcache(id)` svuota la cache di ogni utente il cui filtro contiene quell’identificatore, e la richiesta successiva la ricostruisce.

## Dove la vede l’applicazione

- Il portale elenca solo le applicazioni in `apps` e rifiuta di aprirne qualsiasi altra ("App not found").
- L’applicazione riceve il proprio elenco in `permissions` quando verifica un avvio (un array di stringhe `value`), insieme agli id dei gruppi, così può decidere cosa mostrare ([come si connette un’app](/en/openplatform/how-an-app-connects/)).
- La schermata di configurazione decide chi può usarla tramite il flag `sa` dell’utente.

Una buona abitudine, che deriva da come funziona il codice: dai al `value` di un permesso il nome dell’azione nella tua applicazione (`orders.read`, `orders.write`) e associa i gruppi a quei valori in OpenPlatform, così la tua applicazione controlla solo stringhe.
