Jaki jest podstawowy model tworzenia bazy danych z użytkownikami i grupami?

9

Próbuję znaleźć najlepszy sposób na podstawowy system bezpieczeństwa dla strony internetowej. Wiem, że chcę użytkowników i grup.

Myślałem, że będę miał:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

Pierwszy to użytkownik, drugi to grupa, a trzeci to tabela pośrednicząca, która łączy oba. Jeden użytkownik ma wiele grup.

Czy to brzmi dobrze?

Jasio
źródło
Inne niż nazwiska. Twoja GROUP_TYPEtabela powinna mieć nazwę GROUPlub coś podobnego i GROUP_TABLEpowinieneś odwoływać się zarówno do użytkowników, jak i grup, ponieważ to właśnie łączy.
Adam Musch
@adam nie group_table nie robi tego z user_id i group_id?
Johnny
4
@AdamMusch Nie powinno się nazywać GROUP, ponieważ jest to słowo zastrzeżone. Tabele i kolumny nigdy nie powinny być nazwane po słowach zastrzeżonych
Philᵀᴹ
1
@Phil zgodził się. Równie dobrze możesz nazwać tabelę SELECTi pole, FROMaby otrzymać zapytanie typuSELECT [FROM] FROM [SELECT]
JNK
2
Spróbuj nazwać podstawowe byty czymś w rodzaju „app_user” i „app_role”
ConcernedOfTunbridgeWells

Odpowiedzi:

17

Tradycyjnym sposobem modelowania jest użycie wzorca zwanego Zabezpieczeniami opartymi na rolach .

Chodzi nie tylko o grupy użytkowników, ale także grupy uprawnień. Oto jak wygląda wzór:

ERD zabezpieczeń opartych na rolach

Pamiętaj, że chcesz unikać słów zastrzeżonych dla nazw tabel, więc nie nazywaj swoich tabel dokładnie tak, jak pokazano na schemacie.

Działa to w ten sposób, że grupy lub role mają nie tylko przypisaną do nich listę użytkowników, ale także listę uprawnień do nich przypisanych. To pozwala ci kierować tabelą zarówno tych, którzy potrafią co robić, ale także tego, co mogą zrobić, jeśli pójdziesz za mną.

Joel Brown
źródło
Ale co, jeśli mój użytkownik pełni rolę menedżera lub cokolwiek innego iz jakiegoś powodu ten sam użytkownik potrzebuje również jednego konkretnego uprawnienia (które nie pełni tej roli ani nie pełni żadnej innej roli samodzielnie)?
levi
@levi - Jeśli tak się stanie, jednym ze sposobów, aby sobie z tym poradzić, jest utworzenie specjalnej roli, takiej jak „Specjalne uprawnienia Boba” , co jest trochę kłopotliwe, ale rozwiązuje problem, o ile nie ma zbyt wielu wyjątków, takich jak to. Możliwe, że to, co uważasz za indywidualny wyjątek, może w rzeczywistości być subtelną nową rolą, której nie wziąłeś pod uwagę. Co się stanie, gdy Bob zrezygnuje? Czy zastępstwo Boba również potrzebuje tego wyjątkowego pozwolenia? Jeśli tak, to faktycznie masz rolę z jednym członkiem, a nie wyjątkiem.
Joel Brown
@levi - Inną możliwością jest to, że naprawdę potrzebujesz mieszanki praw indywidualnych i ról. W takim przypadku ROLEtabelę można podzielić na typy indywidualne i grupy , gdzie typ grupy ma zero do wielu członków, a typ indywidualny ma dokładnie jednego członka. To, jak egzekwujesz te zasady dotyczące liczności, zależy od ciebie. Można to zrobić deklaratywnie w schemacie bazy danych, w którym to przypadku należy nieznacznie zmienić przedstawiony schemat. Lub możesz użyć logiki aplikacji, w którym to przypadku twój schemat nadal wygląda tak, jak na powyższym obrazku.
Joel Brown,