Baza danych - implementacja uprawnień

0

W swojej aplikacji chcę blokować dostęp użytkownikom do pewnych części. Uprawnienia trzymam więc w bazie danych i gdy trzeba, to sprawdzam, czy dany użytkownik powinien mieć dostęp do danej funkcjonalności.

Początkowo wyglądało to tak, że każdy użytkownik mógł być przypisany do grupy, która miała określone uprawnienia. Grupy to np.:

Admin
Moderator
Użytkownik
Gość

Baza wyglądała tak:
schemat bazy danych

I działa to prawidłowo. Tworzę sobię uprawnienie Display o kategorii History. Tworzę grupę Moderator, której dodaję takie uprawnienie. Jeśli teraz przypiszę użytkownika do grupy Moderator będzie on mógł teraz wyświetlać historie.

Problem pojawia się, gdy chciałbym, by użytkownik miał przypisaną grupę z uprawnieniami lub miał oddzielne uprawnienia, niezależne od grupy. Nie wiem w którym miejscu to zaimplementować.

Uprawnienia użytkownika wyglądałyby tak samo jak tabela GroupPermission. Może więc zrobić tak, że uprawnienia użytkownika będą jako grupa w tabeli Group, ale do tej tabeli dodam kolumnę OwnerId. Grupy ogólne nie będą miały właściciela, natomiast grupa pojedyńczego użytkownika będzie posiadała jego Id.

Na ten moment mam osobne tabele do uprawnień grupy i uprawnień użytkownika (mimo, że praktycznie identyczne). Jeśli użytkownikowi chcę dać customowe uprawnienia, to muszę zadbać o to, by usunąć mu GroupId. Jeśli natomiast użytkownika przypisuję do grupy, to muszę zadbać o to, by usunąć mu wszystkie uprawnienia customowe.

Czy takie rozwiązanie jest ok? Jak byście to widzieli?

1

Pierwsze ograniczenie jakie rzuca mi się w oczy to użytkownik może należeć tylko do jednej grupy, to zamyka drogę do sensownej konfiguracji uprawnień, bo każdy indywidualny przypadek, nie mieszczący się w zdefiniowanych grupach będzie skutkował stworzeniem nowej grupy, co utrudni administrowanie uprawnieniami. Ja bym zrobił tabele pośrednią UserGroup w której łączyłbym tabele group i user, jeżeli jest wymagane ustawienie dla konkretnego użytkownika to stworzysz grupę w której będzie tylko użytkownik i nadasz uprawnienia.

0

Ja bym do tego co napisał @Panczo rozważył jeszcze bezpośrednie przypisanie uprawnienia do użytkownika, tj. posiadał następujące tabele:

  • User
  • Group
  • Permission

I realizacja N:M za pomocą relacji:

  • User_Group - przypisanie użytkownika do grup
  • User_Permission - przypisanie uprawnień do użytkowników
  • Group_Permission - przypisanie uprawnień do grup

Może kosmetycznie zamiast 'Grupa' użył nazwy 'Rola'. Sensem grupy jest jest ponowne użycie, jeśli takowego brak, to po co tworzyć grupę 1 osobową?
Technicznie obydwie opcje będą ok.

0

Sensem grupy jest jest ponowne użycie, jeśli takowego brak, to po co tworzyć grupę 1 osobową?

Ja leniwy jestem i nie lubię przesadnego rozbudowania tabel by odzwierciedlać rzeczywistość, oczywiście, zgodzę się z tym, że logiczniej jest to oddzielać, bo nadajemy uprawnienia, albo grupie albo użytkownikowi, tylko w ten sposób mamy 2x więcej tabel i przy sprawdzeniu sprawdzamy w 2 miejscach (mniejsza o to jak technicznie to sprawdzenie jest realizowane) Grupa jednoosobowa to taki twór który pozwala, odzwierciedlić uprawnienia per użytkownik. W tym konkretnym przypadku jestem zwolennikiem takiego uproszczenia.

Można dodać jakiś znacznik, że jest to grupa jednoosobowa i pomijać ją w UI przy podpowiadaniu.

0

Uprawnień nie robi się na poziomie użytkownika, lecz roli.
Jeden użytkownik moze mieć kilka ról.

1 użytkowników online, w tym zalogowanych: 0, gości: 1