github.com/pavlo67/common@v0.5.3/common/db/_manuala/rights.md (about)

     1  # Перевірка/встановлення прав на записах в БД
     2  
     3  ## 0. Права на перегляд запису. 
     4  
     5  Це робиться тільки по полю rView. rOwner ні до чого — система не повинна дозволяти виставляти таке rView, на яке власник запису не має прав. Отже, для контролю перегляду — розпаковувати mamagers не треба.
     6  
     7  
     8  
     9  ## 1. Перевірка при створенні запису і формування прав на наступні операції з записом.
    10  
    11  func SetRights(
    12     identity          Identity, 
    13     ctrl              Controller,
    14     interfaceManagers Managers, 
    15     newRecordManagers Managers) (IdentityString, IdentityString, []byte, error)
    16  
    17  Створення запису дозволяється тільки якщо користувач має права відповідні до interfaceManagers[rights.Create], инакше — помилка (зокрема, коли interfaceManagers не задано або там нема значення для rights.Create).
    18  
    19  Якщо newRecordManagers == nil або там не задано rights.RView і/або rights.ROwner — ці права встановлюються згідно Identity
    20  
    21  Всі права, які задано в newRecordManagers повинні бути у самого користувача. Не можна встановити право, якого сам не маєш. Така спроба — помилка.
    22  
    23  Якщо всі перевірки пройшли, то функція повертає оновлені rView та rOwner і упаковане поле managers.
    24  
    25  Якщо ctrl не задано, права перевіряються тільки на співпадіння IdentityString, якщо ж заданий — то також і на BelongsTo().
    26  
    27  
    28  
    29  ## 2. Перевірка/оновлення прав при спробі зміни запису.
    30  
    31  Змінювати можна тільки сам запис, а можна змінювати і якісь права доступу до нього. Отже, нехай все це перевіряється
    32  одною функцією:
    33  
    34  func CheckAndUpdateRights(
    35     identity                Identity, 
    36     ctrl                    Controller, 
    37     rView, rOwner, managers string, 
    38     updatedRecordManagers   Managers) (IdentityString, IdentityString, []byte, error)
    39  
    40  І правила наступні.
    41  
    42  rView, rOwner, managers — це поля запису, "як є". managers треба розпакувати, а rView та rOwner конвертнути в IdentityString. 
    43  
    44  updatedRecordManagers (може містити ключі rights.RView, rights.ROwner) треба порівняти з наявними правами —
    45  якщо updatedRecordManagers == nil або в updatedRecordManagers нема ніяких змін щодо поточних прав — "права на зміну прав"
    46  не перевіряємо.
    47  
    48  Якщо ж в updatedRecordManagers задана зміна прав, то:
    49  * дозволяємо її тільки якщо identity має права rights.ROwner, инакше — помилка;
    50  * всі права, які задано в updatedRecordManagers повинні бути у самого користувача — не можна встановити право,
    51  якого сам не маєш, така спроба — помилка.
    52  * якщо всі перевірки пройшли успішно, то функція повертає оновлені rView та rOwner і перепаковане поле managers
    53  (в цьому випадку вважаємо, що заодно, користувач має право міняти і все инше в записі, більше перевірок не треба).
    54  
    55  Якщо ж в updatedRecordManagers не була задана зміна прав, то:
    56  * слід перевірити права на зміну запису: rights.ROwner або rights.RChange, якщо ця перевірка не успішна — помилка;
    57  * якщо ж перевірка пройшла успішно — функція повертає вихідні значення rView, rOwner, managers без змін.
    58  
    59  Якщо ctrl не задано, права перевіряються тільки на співпадіння IdentityString, якщо ж заданий — то також і на BelongsTo().
    60  
    61  ## 3. Перевірка/оновлення прав при спробі вилучення запису.
    62  
    63  func CheckDeleteRights(
    64     identity         Identity, 
    65     ctrl             Controller, 
    66     rOwner, managers string) error
    67  
    68  rOwner, managers — це поля запису, "як є". Перевіряємо, чи identity має права rOwner або managers[rights.Delete].