# Потребители, групи и права в OpenPlatform

> Как потребителят достига до приложение в OpenPlatform: групите решават кои приложения вижда потребителят и какви стойности на права получава всяко приложение.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: bg
Content-SHA256: 6630fc8fc2b8a5da5e55a5ea9b76f699a473d4fca3887b1d11a008d5f058e5aa
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

OpenPlatform разделя **кой** (потребители), **къде** (приложения) и **какво** (права), с групите по средата:

- **Потребителят** има име, имейл, език, парола и флагове (`sa` за администратор, `isconfirmed`, `isdisabled`, `isinactive`, `notifications`, `sounds`...) и принадлежи към произволен брой групи (схема `@User`, `plugins/setup/schemas/users.js`).
- **Групата** има име, цвят, икона, незадължителен `reference` и списък с права (схема `@Group`, `plugins/setup/schemas/groups.js`).
- **Приложението** декларира собствени права: всяко има име и `value`, обикновен низ, който приложението разбира (`plugins/setup/schemas/apps.js`).

## Как се изчислява достъпът

Функцията `FUNC.permissions(userid, callback)` в `definitions/func.js` изгражда за потребителя:

1. групите на потребителя, които не са деактивирани;
2. редовете на `tbl_group_permission` на тези групи: ред с право дава това право на приложение, а ред **без** право дава само приложението (потребителят го вижда и получава празен списък с права);
3. `value` на всяко дадено право, само за приложения, които не са премахнати и не са деактивирани.

Резултатът има три части: приложенията на потребителя (`apps`), стойностите на правата по приложения (`permissions`) и групите (`groups`). Съхранява се като JSON в колоната `cache` на потребителя, с `cachefilter`, който изброява групите (`G<id>`) и приложенията (`A<id>`), от които зависи. Когато една група или приложение се промени, `FUNC.clearcache(id)` изчиства кеша на всеки потребител, чийто филтър съдържа този идентификатор, а следващата заявка го изгражда отново.

## Къде го вижда приложението

- Порталът изброява само приложенията в `apps` и отказва да отвори което и да е друго ("App not found").
- Приложението получава собствения си списък в `permissions`, когато проверява стартиране (масив от низове `value`), заедно с идентификаторите на групите, за да може да реши какво да покаже ([как се свързва едно приложение](/en/openplatform/how-an-app-connects/)).
- Екранът за настройка решава кой може да го използва чрез флага `sa` на потребителя.

Добър навик, който следва от начина, по който работи кодът: наименувайте `value` на правото по действието във вашето приложение (`orders.read`, `orders.write`) и свържете групите с тези стойности в OpenPlatform, така че приложението ви да проверява само низове.
