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].