Припускаючи таку структуру бази даних (за потреби змінюється) ...
Я шукаю хороший спосіб визначити "ефективні дозволи" для певного користувача на певній сторінці таким чином, що дозволяє мені повернути рядок, що містить Сторінку та ефективні дозволи.
Я думаю, що ідеальне рішення може включати в себе функцію, яка використовує CTE для виконання рекурсії, необхідної для оцінки "ефективних дозволів" для заданого рядка сторінки для поточного користувача.
Основні відомості та відомості про реалізацію
Вищевказана схема являє собою початкову точку для системи управління вмістом, в якій користувачі можуть надавати дозволи, додаючи та вилучаючи з ролей.
Ресурси в системі (наприклад, сторінки) пов'язані з ролями, щоб надати групі користувачів, пов'язаних з цією ролю, дозволи, які вона надає.
Ідея полягає у тому, щоб мати можливість легко заблокувати користувача, просто відмовившись у всій ролі та додавши сторінку кореневого рівня до дерева до цієї ролі, а потім додати користувача до цієї ролі.
Це дозволило б структурі дозволів залишатися на місці, коли (наприклад) підрядник, який працює в компанії, не є доступним протягом тривалого періоду, це також дозволить отримати те саме надання їхніх оригінальних дозволів, просто видаливши користувача з тієї однієї ролі .
Дозволи мають базуватися на типових правилах типу ACL, які можуть застосовуватися до файлової системи, дотримуючись цих правил.
Права CRUD повинні бути нульовими бітами, тому доступні значення є істинними, хибними, не визначеними, де відповідає дійсності наступне:
- false + нічого = хибно
- true + не визначено = true
- true + true = правда
- не визначено + не визначено = не визначено
Якщо будь-який з дозволів хибний -> false Інше, якщо така є правда -> правда Інше (все не визначено) -> хибно
Іншими словами, ви не отримуєте жодних дозволів на що-небудь, якщо вам не надано їх через членство в ролі, а правило заборони не перевищує допустиме правило.
"Набір" дозволів, до яких це стосується, є всіма дозволами, застосованими до дерева до та включаючи поточну сторінку, іншими словами: Якщо помилка в будь-якій ролі застосована до будь-якої сторінки в дереві на цій сторінці, результат є помилковим , але якщо ціле дерево до цього часу не визначене, то поточна сторінка містить справжнє правило, результат є вірним тут, але був би хибним для батьків.
Я хотів би вільно зберігати структуру db, якщо це можливо, також майте на увазі, що моя мета тут - вміти робити щось на кшталт: select * from pages where effective permissions (read = true) and user = ?
тому будь-яке рішення повинно мати змогу дозволити мені мати набір для запиту з ефективними дозволами в них певним чином (повернення їх необов’язково, доки критерії можуть бути визначені).
Якщо припустити, що існують 2 сторінки, де 1 є дочірньою частиною інших, і дві ролі існують, одна для користувачів адміністратора та 1 для користувачів лише для читання, обидві пов'язані лише з сторінкою кореневого рівня, я б очікував побачити щось подібне як очікуваний вихід:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
Подальшу дискусію навколо цього питання можна знайти в головній кімнаті чату, що починається тут .