# Usuarios, grupos y permisos en OpenPlatform

> Cómo llega un usuario a una aplicación en OpenPlatform: los grupos deciden qué aplicaciones ve el usuario y qué valores de permiso recibe cada aplicación.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: es
Content-SHA256: 25e3178f09450116a87c92d7f0ed8e9f7ef5837fecfa0e92bb6b11dec12c6896
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

OpenPlatform separa **quién** (usuarios), **dónde** (aplicaciones) y **qué** (permisos) con los grupos en medio:

- Un **usuario** tiene nombre, correo, idioma, contraseña y banderas (`sa` para administrador, `isconfirmed`, `isdisabled`, `isinactive`, `notifications`, `sounds`...) y pertenece a cualquier número de grupos (esquema `@User`, `plugins/setup/schemas/users.js`).
- Un **grupo** tiene nombre, color, icono, una `reference` opcional y una lista de permisos (esquema `@Group`, `plugins/setup/schemas/groups.js`).
- Una **aplicación** declara sus propios permisos: cada uno tiene un nombre y un `value`, una cadena simple que la aplicación entiende (`plugins/setup/schemas/apps.js`).

## Cómo se calcula el acceso

La función `FUNC.permissions(userid, callback)` de `definitions/func.js` construye, para un usuario:

1. los grupos del usuario que no están deshabilitados;
2. las filas de `tbl_group_permission` de esos grupos: una fila con un permiso concede ese permiso de una aplicación, y una fila **sin** permiso solo concede la aplicación (el usuario la ve y recibe una lista de permisos vacía);
3. el `value` de cada permiso concedido, solo para aplicaciones que no estén eliminadas ni deshabilitadas.

El resultado tiene tres partes: las aplicaciones del usuario (`apps`), los valores de permiso por aplicación (`permissions`) y los grupos (`groups`). Se guarda como JSON en la columna `cache` del usuario, con un `cachefilter` que lista los grupos (`G<id>`) y las aplicaciones (`A<id>`) de los que depende. Cuando cambia un grupo o una aplicación, `FUNC.clearcache(id)` borra la caché de todo usuario cuyo filtro contenga ese identificador, y la siguiente petición la reconstruye.

## Dónde la ve la aplicación

- El portal lista solo las aplicaciones de `apps` y se niega a abrir cualquier otra ("App not found").
- La aplicación recibe su propia lista en `permissions` cuando verifica un lanzamiento (un array de cadenas `value`), junto con los ids de los grupos, para poder decidir qué mostrar ([cómo se conecta una app](/en/openplatform/how-an-app-connects/)).
- La pantalla de configuración decide quién puede usarla por la bandera `sa` del usuario.

Un buen hábito, por cómo funciona el código: nombra el `value` de un permiso según la acción de tu aplicación (`orders.read`, `orders.write`) y asigna los grupos a esos valores en OpenPlatform, de modo que tu aplicación solo compruebe cadenas.
