# Utilizadores, grupos e permissões no OpenPlatform

> Como um utilizador chega a uma aplicação no OpenPlatform: os grupos decidem que aplicações o utilizador vê e que valores de permissão cada aplicação recebe.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: pt
Content-SHA256: e877feb69784ed4421a31ff1c8b2a9d592dbbe13eeaad6015992c3cefaa861a8
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

O OpenPlatform separa **quem** (utilizadores), **onde** (aplicações) e **o quê** (permissões) com os grupos no meio:

- Um **utilizador** tem nome, e-mail, idioma, palavra-passe e indicadores (`sa` para administrador, `isconfirmed`, `isdisabled`, `isinactive`, `notifications`, `sounds`...) e pertence a qualquer número de grupos (esquema `@User`, `plugins/setup/schemas/users.js`).
- Um **grupo** tem nome, cor, ícone, uma `reference` opcional e uma lista de permissões (esquema `@Group`, `plugins/setup/schemas/groups.js`).
- Uma **aplicação** declara as suas próprias permissões: cada uma tem um nome e um `value`, uma cadeia simples que a aplicação entende (`plugins/setup/schemas/apps.js`).

## Como o acesso é calculado

A função `FUNC.permissions(userid, callback)` em `definitions/func.js` constrói, para um utilizador:

1. os grupos do utilizador que não estão desativados;
2. as linhas de `tbl_group_permission` desses grupos: uma linha com uma permissão concede essa permissão de uma aplicação, e uma linha **sem** permissão só concede a aplicação (o utilizador vê-a e recebe uma lista de permissões vazia);
3. o `value` de cada permissão concedida, apenas para aplicações que não estão removidas nem desativadas.

O resultado tem três partes: as aplicações do utilizador (`apps`), os valores de permissão por aplicação (`permissions`) e os grupos (`groups`). É guardado como JSON na coluna `cache` do utilizador, com um `cachefilter` que lista os grupos (`G<id>`) e as aplicações (`A<id>`) de que depende. Quando um grupo ou uma aplicação muda, `FUNC.clearcache(id)` limpa a cache de todo o utilizador cujo filtro contenha esse identificador, e o pedido seguinte reconstrói-a.

## Onde a aplicação a vê

- O portal lista apenas as aplicações em `apps` e recusa abrir qualquer outra ("App not found").
- A aplicação recebe a sua própria lista em `permissions` quando verifica um lançamento (um array de cadeias `value`), juntamente com os ids dos grupos, para poder decidir o que mostrar ([como uma app se liga](/en/openplatform/how-an-app-connects/)).
- O ecrã de configuração decide quem o pode usar pelo indicador `sa` do utilizador.

Um bom hábito, pela forma como o código funciona: dê ao `value` de uma permissão o nome da ação na sua aplicação (`orders.read`, `orders.write`) e associe os grupos a esses valores no OpenPlatform, de modo que a sua aplicação só verifique cadeias.
