# Utilisateurs, groupes et permissions dans OpenPlatform

> Comment un utilisateur atteint une application dans OpenPlatform : les groupes décident quelles applications l’utilisateur voit et quelles valeurs de permission chaque application reçoit.

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

OpenPlatform sépare **qui** (les utilisateurs), **où** (les applications) et **quoi** (les permissions), avec les groupes au milieu :

- Un **utilisateur** a un nom, un e-mail, une langue, un mot de passe et des indicateurs (`sa` pour administrateur, `isconfirmed`, `isdisabled`, `isinactive`, `notifications`, `sounds`...) et appartient à un nombre quelconque de groupes (schéma `@User`, `plugins/setup/schemas/users.js`).
- Un **groupe** a un nom, une couleur, une icône, une `reference` facultative et une liste de permissions (schéma `@Group`, `plugins/setup/schemas/groups.js`).
- Une **application** déclare ses propres permissions : chacune a un nom et un `value`, une simple chaîne que l’application comprend (`plugins/setup/schemas/apps.js`).

## Comment l’accès est calculé

La fonction `FUNC.permissions(userid, callback)` de `definitions/func.js` construit, pour un utilisateur :

1. les groupes de l’utilisateur qui ne sont pas désactivés ;
2. les lignes de `tbl_group_permission` de ces groupes : une ligne avec une permission accorde cette permission d’une application, et une ligne **sans** permission accorde simplement l’application (l’utilisateur la voit et reçoit une liste de permissions vide) ;
3. le `value` de chaque permission accordée, seulement pour les applications qui ne sont ni supprimées ni désactivées.

Le résultat comporte trois parties : les applications de l’utilisateur (`apps`), les valeurs de permission par application (`permissions`) et les groupes (`groups`). Il est stocké en JSON dans la colonne `cache` de l’utilisateur, avec un `cachefilter` qui liste les groupes (`G<id>`) et les applications (`A<id>`) dont il dépend. Quand un groupe ou une application change, `FUNC.clearcache(id)` vide le cache de chaque utilisateur dont le filtre contient cet identifiant, et la requête suivante le reconstruit.

## Où l’application le voit

- Le portail ne liste que les applications de `apps` et refuse d’en ouvrir une autre ("App not found").
- L’application reçoit sa propre liste dans `permissions` quand elle vérifie un lancement (un tableau de chaînes `value`), avec les ids des groupes, pour pouvoir décider quoi afficher ([comment une app se connecte](/en/openplatform/how-an-app-connects/)).
- L’écran de configuration décide qui peut l’utiliser grâce à l’indicateur `sa` de l’utilisateur.

Une bonne habitude, tirée du fonctionnement du code : nommez le `value` d’une permission d’après l’action dans votre application (`orders.read`, `orders.write`) et associez les groupes à ces valeurs dans OpenPlatform, pour que votre application ne vérifie que des chaînes.
