Zakładając następującą strukturę bazy danych (w razie potrzeby modyfikowalną) ...
Szukam dobrego sposobu na określenie „efektywnych uprawnień” dla danego użytkownika na danej stronie w sposób, który pozwoli mi zwrócić wiersz zawierający stronę i efektywne uprawnienia.
Myślę, że idealnym rozwiązaniem może być funkcja wykorzystująca CTE do wykonania rekurencji potrzebnej do oceny „efektywnych uprawnień” dla danego wiersza strony dla bieżącego użytkownika.
Tło i szczegóły realizacji
Powyższy schemat stanowi punkt początkowy systemu zarządzania treścią, w którym użytkownikom można przyznawać uprawnienia poprzez dodawanie i usuwanie z ról.
Zasoby w systemie (np. Strony) są powiązane z rolami, aby nadać grupie użytkowników powiązanych z tą rolą uprawnienia, które przyznaje.
Chodzi o to, aby móc łatwo zablokować użytkownika, po prostu odmawiając roli i dodając stronę poziomu głównego w drzewie do tej roli, a następnie dodając użytkownika do tej roli.
Umożliwiłoby to utrzymanie struktury uprawnień, gdy (na przykład) kontrahent pracujący dla firmy nie byłby dostępny przez długi czas, umożliwiłoby to również takie samo udzielenie pierwotnych uprawnień, po prostu usuwając użytkownika z tej jednej roli .
Uprawnienia są oparte na typowych regułach typu ACL, które mogą mieć zastosowanie do systemu plików, przestrzegając tych reguł.
Uprawnienia CRUD mają być zerowalnymi bitami, więc dostępne wartości są prawdziwe, fałszywe, nie są zdefiniowane, gdy spełnione są następujące warunki:
- false + cokolwiek = false
- true + nie zdefiniowano = true
- prawda + prawda = prawda
- nie zdefiniowano + nie zdefiniowano = nie zdefiniowano
Jeśli którekolwiek z uprawnień jest fałszywe -> fałszywe W przeciwnym razie prawda jest> prawda W przeciwnym razie (wszystkie nie zdefiniowane) -> fałsz
Innymi słowy, nie otrzymujesz żadnych uprawnień, chyba że uzyskasz je poprzez członkostwo w roli, a reguła odmowy zastępuje regułę zezwalania.
„Zestaw” uprawnień, których dotyczy, to wszystkie uprawnienia zastosowane do drzewa do bieżącej strony włącznie, innymi słowy: jeśli fałsz ma jakąkolwiek rolę zastosowaną do dowolnej strony w drzewie tej strony, wynik jest fałszywy , ale jeśli całe drzewo do tej pory nie jest zdefiniowane, bieżąca strona zawiera prawdziwą regułę, wynik jest tutaj prawdziwy, ale dla rodzica byłby fałszywy.
Chciałbym luźno zachować strukturę db, jeśli to możliwe, należy również pamiętać, że moim celem tutaj jest możliwość zrobienia czegoś takiego: select * from pages where effective permissions (read = true) and user = ?
więc każde rozwiązanie powinno pozwolić mi mieć zestaw zapytań z efektywnymi uprawnieniami w nich w jakiś sposób (ich zwrot jest opcjonalny, o ile można określić kryteria).
Zakładając, że istnieją 2 strony, na których 1 jest dzieckiem drugiej, a istnieją 2 role, jedna dla użytkowników administracyjnych i 1 dla użytkowników tylko do odczytu, obie są połączone tylko ze stroną poziomu głównego.
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
Dalszą dyskusję wokół tego pytania można znaleźć w głównym czacie na stronie, zaczynając tutaj .