Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Schemat bazy dla uprawnień użytkowników

Jaki sugerujecie schemat części bazy danych do przechowywania informacji do zarządzania i sprawdzania uprawnień użytkowników jakiegoś programu? Czyli ten program ma wiele funkcjonalności, które użytkownik może albo nie może wykonać. Różni użytkownicy mogą należeć do różnych (kilku) grup. Grupa ma uprawnienia ale pojedynczy użytkownik może je mieć nadpisane. Uprawnienia zabraniające mają wyższy priorytet niż zezwalające.

Baza to pgsql, uprawnienia chcę sprawdzać własnymi funkcjami - to podaję tylko informacyjnie.

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

Paweł Koralewski:
Jaki sugerujecie schemat części bazy danych do przechowywania informacji do zarządzania i sprawdzania uprawnień użytkowników jakiegoś programu?

To zależy od złożoności programu.
Różni użytkownicy mogą należeć do różnych (kilku) grup.

Standard.
Grupa ma uprawnienia ale pojedynczy użytkownik może je mieć nadpisane.

Nadpisywanie uprawnień per użytkownik to nie jest dobry pomysł. Dlaczego? Tworzysz furtkę dla wyjątków, zwiększasz liczbę możliwych kombinacji, komplikujesz system uprawnień.
Uprawnienia zabraniające mają wyższy priorytet niż zezwalające.

A nie lepiej założyć że wszystko jest zabronione, dopóki nie zostanie jawnie dozwolone? Tak będzie prościej.
Baza to pgsql, uprawnienia chcę sprawdzać własnymi funkcjami - to podaję tylko informacyjnie.

To nie ma znaczenia, jaka baza. Jeśli to jest prosty program, to proponuję wziąć za wzór system uprawnień z Drupala.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Schemat bazy dla uprawnień użytkowników

Grupa ma uprawnienia ale pojedynczy użytkownik może je mieć nadpisane.

Nadpisywanie uprawnień per użytkownik to nie jest dobry pomysł. Dlaczego? Tworzysz furtkę dla wyjątków, zwiększasz liczbę możliwych kombinacji, komplikujesz system uprawnień.

Wystarczy traktować pojedynczego użytkownika jako jednoosobową grupę, która nie może być zmieniania i problem sprowadza się do tego samego, więc żadnych dodatkowych komplikacji nie ma.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Schemat bazy dla uprawnień użytkowników

Paweł Koralewski:
Baza to pgsql, uprawnienia chcę sprawdzać własnymi funkcjami - to podaję tylko informacyjnie.

Nie znam pgsql, ale być może system uprawnień, który oferuje, będzie Ci wystarczał. Jesli tak, to ja bym to zorganizował w następujący sposób:
Każda funkcjonalność do jakiej nadajesz uprawnienia reprezentowana by była w bazie jako tabela, każdy użytkownik i grupa reprezentowane by były jako użytkownicy/grupy pgsql. Następnie użytkownikom/grupom nadawałbym uprawnienia do tabel (reprezentujących funkcjonalności). Sprawdzanie czy ktoś ma uprawnienia odbywało by się na zasadzie sprawdzenia, czy ktoś ma prawo do odczytu z tabeli (program się loguje na tego uzytkownika i strzela select na tabeli i sprawdza, czy nie wystąpił błąd). W ten sposób cała logika sprawdzania uprawnienia, będzie się odbywać, przy wykorzystaniu systemu uprawnień pgsql.

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

Łukasz Kurowski:
Wystarczy traktować pojedynczego użytkownika jako jednoosobową grupę, która nie może być zmieniania i problem sprowadza się do tego samego, więc żadnych dodatkowych komplikacji nie ma.

Co znaczy nie może być zmieniana? A jak do pracy na miejsce pani Krysi przyjdzie pani Jadzia na zastępstwo? Albo pani Jadzia nie będzie się wyrabiać z obowiązkami i do pani Krysi dołączy pani Jadzia? Utworzysz osobną grupę dla pani Jadzi?

Oczywiście pozostaje jeszcze kwestia odpowiedniego nazewnictwa grupy (czy też roli). Bo jeśli grupa zostanie nazwana pani-krysia, no to pozamiatane :)
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Schemat bazy dla uprawnień użytkowników

Łukasz Kurowski:

Nie znam pgsql, ale być może system uprawnień, który oferuje, będzie Ci wystarczał. Jesli tak, to ja bym to zorganizował w następujący sposób:
Każda funkcjonalność do jakiej nadajesz uprawnienia reprezentowana by była w bazie jako tabela, każdy użytkownik i grupa reprezentowane by były jako użytkownicy/grupy pgsql. Następnie użytkownikom/grupom nadawałbym uprawnienia do tabel (reprezentujących funkcjonalności). Sprawdzanie czy ktoś ma uprawnienia odbywało by się na zasadzie sprawdzenia, czy ktoś ma prawo do odczytu z tabeli (program się loguje na tego uzytkownika i strzela select na tabeli i sprawdza, czy nie wystąpił błąd). W ten sposób cała logika sprawdzania uprawnienia, będzie się odbywać, przy wykorzystaniu systemu uprawnień pgsql.

Tak sie nie da sie. Potrzebuję mieć możliwość nadawania różnych uprawnień dla różnych obiektów w tej samej tabeli. Poza tym nowych userów może dodawać admin w programie, który nie będzie miał uprawnień do dodawania użytkowników w pgsql.

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

Łukasz Kurowski:
Nie znam pgsql, ale być może system uprawnień, który oferuje, będzie Ci wystarczał.
[...]
W ten sposób cała logika sprawdzania uprawnienia, będzie się odbywać, przy wykorzystaniu systemu uprawnień pgsql.

Nie można tak mocno wiązać warstwy aplikacji z warstwą bazy danych, bo:

1. jest to niebezpieczne (użytkownik, na którym działa aplikacja, musi mieć bardzo duże uprawnienia na bazie danych).
2. jest to sprzeczne z ideą przenośności oprogramowania.

I pewnie jeszcze z kilku innych powodów.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Schemat bazy dla uprawnień użytkowników

Tomasz K.:
Co znaczy nie może być zmieniana? A jak do pracy na miejsce pani Krysi przyjdzie pani Jadzia na zastępstwo? Albo pani Jadzia nie będzie się wyrabiać z obowiązkami i do pani Krysi dołączy pani Jadzia? Utworzysz osobną grupę dla pani Jadzi?

Oczywiście pozostaje jeszcze kwestia odpowiedniego nazewnictwa grupy (czy też roli). Bo jeśli grupa zostanie nazwana pani-krysia, no to pozamiatane :)

Jak rozumiem kolega pisze program do zarządzania uprawnieniami, a nie nadaje uprawnienia, więc chodziło mi o rozróżnienie logiczne jakie poczyniłeś na użytkownika/grupę. Użytkownik to też grupa tyle, że jednoosobowa, więc algorytm, który będzie uwzględniał też użytkowników będzie taki sam jakby istniały tylko grupy. To co wskazałeś jest już problemem samych uprawnień, które chce się nadać, a nie pisania programu. Ja jakbym implementował system uprawnień, oczywiście unikałbym nadawania uprawnień konkretnym użytkownikom. Właściwie powinno to być wyjątkiem rzadko używanym. Tworzybym grupy i pomiędzy nimi żonglował użytkownikami.Łukasz Kurowski edytował(a) ten post dnia 28.01.11 o godzinie 12:05
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Schemat bazy dla uprawnień użytkowników

Tomasz K.:
Łukasz Kurowski:
Nie znam pgsql, ale być może system uprawnień, który oferuje, będzie Ci wystarczał.
[...]
W ten sposób cała logika sprawdzania uprawnienia, będzie się odbywać, przy wykorzystaniu systemu uprawnień pgsql.

Nie można tak mocno wiązać warstwy aplikacji z warstwą bazy danych, bo:

1. jest to niebezpieczne (użytkownik, na którym działa aplikacja, musi mieć bardzo duże uprawnienia na bazie danych).
2. jest to sprzeczne z ideą przenośności oprogramowania.

I pewnie jeszcze z kilku innych powodów.

Zgadza się, ale ma jeden duży plus... byłoby proste i szybkie do napisania :). Cała reszta to minusy.
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Schemat bazy dla uprawnień użytkowników

Łukasz Kurowski:

Zgadza się, ale ma jeden duży plus... byłoby proste i szybkie do napisania :). Cała reszta to minusy.

Oprogramowanie (strona www) będzie instalowane na różnych serwerach, gdzie może nie być możliwości zaawansowanego zarządzania użytkownikami bazy z poziomu programu, więc takie rozwiązanie odpada.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Schemat bazy dla uprawnień użytkowników

Paweł Koralewski:
Łukasz Kurowski:

Zgadza się, ale ma jeden duży plus... byłoby proste i szybkie do napisania :). Cała reszta to minusy.

Oprogramowanie (strona www) będzie instalowane na różnych serwerach, gdzie może nie być możliwości zaawansowanego zarządzania użytkownikami bazy z poziomu programu, więc takie rozwiązanie odpada.

Odpada, więc musisz nastrugać własny program w 100%. Może jest gotowy open source, który mógłbyś wykorzystać...
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Schemat bazy dla uprawnień użytkowników

Łukasz Kurowski:

Odpada, więc musisz nastrugać własny program w 100%. Może jest gotowy open source, który mógłbyś wykorzystać...

Liczę się z własnoręczną rzeźbą. Stąd moje początkowe pytanie o sugerowaną strukturę danych ;)

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

W skrócie:
Poza słownikami użytkowników, grup i uprawnień potrzebne są takie encje/tabelki:

Przynależność (użytkownika do grupy):
* id_użytkownika
* id_grupy

Nadanie uprawnienia:
* id_grupy
* id_uprawnienia

Pomijam atrybuty służące audytowi (daty nadania, odebrania uprawnień, kto...) To taka najprostsza i najczystsza forma i zgadzam się z pierwszą odpowiedzią, że dalsze mieszanie jest komplikowaniem sobie życia :) Ale jeśli chcesz, to:

- żeby móc nadać uprawnienia pojedynczemu użytkownikowi potrzebujesz albo dwóch encji: "nadanie uprawnienia użytkownikowi" (id_użytkownika, id_uprawnienia) oraz "nadanie uprawnienia grupie" (id_grupy, id_uprawnienia) albo jednej "nadanie uprawnienia" (id_użytkownika, id_grupy, id_uprawnienia), gdzie każdy rekord ma wypełnione tylko jedno z pól: użytkownik lub grupa.

- żeby mieć uprawnienia zabraniające wystarczy dodatkowy znacznik zezwól/zabroń na nadaniu uprawnienia - żeby wiedzieć czy mam uprawnienie muszę sprawdzić czy mam nadane "zezwól" oraz czy nie mam nadanego "zabroń"

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

2 pytania:

1. Jak bardzo szczegółowy będzie system uprawnień ? Myślimy tu nad przypisaniem kilkunastu, kilkudziesięciu elementów użytkownikowi ? Czy może nawet kilku setek albo i więcej ?
2. Będzie Ci zależało na np wypisywaniu użytkowników posiadających uprawnienia do poszczególnych elementów ? Czy Cie to nie interesuje ?
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Schemat bazy dla uprawnień użytkowników

Dariusz Półtorak:
2 pytania:

1. Jak bardzo szczegółowy będzie system uprawnień ? Myślimy tu nad przypisaniem kilkunastu, kilkudziesięciu elementów użytkownikowi ? Czy może nawet kilku setek albo i więcej ?

Niestety nie mam rozpisanego całego projektu. Zaraz mnie zabiją ;) Ale spodziewałbym się setek.
2. Będzie Ci zależało na np wypisywaniu użytkowników posiadających uprawnienia do poszczególnych elementów ? Czy Cie to nie interesuje ?

Raczej nie, ale się nie zapieram.

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

Pytam bo przy małej ilości elementów czy niezbyt skomplikowanym systemie czasami zamiast kombinować, warto po prostu wrzucić pole text do użytkownika i oddzielając przecinkiem wymienić elementy do których ma uprawnienia.
Widziałem też zapisy w stylu "moduł/akcja, moduł2/akcja, moduł2/akcja2 itp...".
Można czasami po prostu zrobić tablicę uprawnień i przeprowadzić serializację. Stąd drugie pytanie. Chcąc w takim wypadku wyszukać użytkowników o konkretnych uprawnieniach, miał byś problem.

Przy większej ilości elementów oprzeć to lepiej na bazie danych. Tutaj z kolei pojawiają się pytania które zależne są od samej aplikacji a jak wspomniałeś, właściwie nie masz jej rozpisanej.

Przykład:
Tworzysz sobie część administracyjną, tam wypisujesz użytkownikowi np listę modułów czy obszarów w swojej aplikacji do których ma dostęp. I tu rodzi Ci się pytanie: czy pobrać na raz całą listę uprawnień i gdzieś ją przechowywać na czas korzystania z aplikacji ? Czy też może pokazywać pełną listę modułów i w momencie ich wybrania sprawdzać uprawnienia i wypisać odpowiedni komunikat.

Kolejna rzecz, użytkownik wchodzi do aplikacji i widzi jej całość. Czy są jakieś elementy które nie powinny być widoczne jeżeli nie ma do nich dostępu ? Jeżeli tak to pobieramy całość uprawnień ? Czy może tylko te które dotyczą danego widoku w aplikacji ?

Czy uprawnienia będą bardzo ziarniste ? Tzn czy użytkownik może dostać uprawnienia do pojedynczego elementu np w bazie danych a do pozostałych nie (a może 3-4 z 5000 ?), uprawnienia różnego typu (zapis, odczyt itp). No i czy jest to częsta praktyka czy wprowadzana "na wszelki wypadek".

Te i inne pytania powinny zostać postawione i powinna się znaleźć na nie odpowiedź. Jeżeli w tym momencie zbudujesz system uprawnień do aplikacji której nie masz to na 75% to się źle skończy.

Sugerował bym najpierw zaprojektować aplikacje (strukturę) a dopiero później system uprawnień adekwatny do niej. Bo jak będziesz chciał nadać uprawnienia np jakiejś pozycji w sklepie a potem jakiejś stronie w portalu to pasuje by to miało ręce i nogi.
Swego czasu podziwiałem system uprawnień na jakiś bitach. Był bardzo "lekki" dla aplikacji, bardzo szybki w działaniu itp ale jak już się sypnął to nie wiedziałeś co do czego. Nie mówiąc o tym że potencjalny klient na ogół ma różne dziwne życzenia i pasuje je przewidywać. Żeby jakiś drobiazg nie zajął programistom tygodnia dlatego że system w ogóle nie przewidywał czegoś.

konto usunięte

Temat: Schemat bazy dla uprawnień użytkowników

A co byscie powiedzieli na zaprzegniecie do tego LDAP'a?
Zakladam, ze taki system uprawnien bedzie mial strukture drzewiasta ( z Menu File mozna wybrac New, Open...) czyli ladnie by sie mapowalo na drzewiasta strukture LDAP'a. Tak na szybko widze to w ten sposob (wersja uproszczona): Jesli komus nadajemy uprawnienie do File->Open, to wpisujemy jego ID do pola File.Open i komorki nadrzednej (File). W aplikacji przed wyswietleniem menu (wyswietleniem opcji) sprawdzamy LDAP'a - jesli w polu LDAP'a odpowiadajacym temu polu menu jest ID uzytkownika to opcja jest enabled, w przeciwnym wypadku Disabled. Nastepnym krokiem moze byc komplikowanie sobie zycia: dodanie grup i "zakazanych" ID: czyli jesli uzytkownik chce wejsc do menu to sprawdzamy czy jego grupa jest wymieniona i jego ID NIE ma na liscie zakazanych ID.
Piotr T.

Piotr T. Spring/Microservices

Temat: Schemat bazy dla uprawnień użytkowników

Paweł Koralewski:
Jaki sugerujecie schemat części bazy danych do przechowywania informacji do zarządzania i sprawdzania uprawnień użytkowników jakiegoś programu? Czyli ten program ma wiele funkcjonalności, które użytkownik może albo nie może wykonać. Różni użytkownicy mogą należeć do różnych (kilku) grup.
tabele słownikowe:
uprawnienia do akcji
grupa jest powiązana z uprawnieniem poprzez tabele łącznikową z flagą określającą relacje
zezwól/zakaż
grupa może być agregatem zbioru grup poprzez tabelę łącznikową
Założenia:
żadne 2 grupy nie mogą mieć takich samych uprawnień
każdy użytkownik jest członkiem co najmniej 1 grupy
Grupa ma uprawnienia ale pojedynczy użytkownik może je mieć nadpisane.
w takim wypadku wystarczy stworzyć grupę dziedziczącą z już istniejącej grupy i następnie przydzielić użytkownika
Uprawnienia zabraniające mają wyższy priorytet niż zezwalające.
2 drzewa uprawnień zezwól/zakaż
użytkownicy mają dostęp tylko do zasobów wskazywanych przez uprawnienie zezwól których nie ma w zbiorze uprawnień zakaż.
grupa powinna mieć 2 reprezentacje : "słownikową" z 2 drzewami uprawnień i drugą tylko do odczytu zawierającą jedno drzewo uprawnień z uprawnieniami tylko "zezwól" czyli różnicę zbiorów zezwól-zakaż.Piotr T. edytował(a) ten post dnia 31.01.11 o godzinie 19:57
Marcin Molga

Marcin Molga Senior Solution
Architect, IBM.

Temat: Schemat bazy dla uprawnień użytkowników

Paweł Koralewski:
Jaki sugerujecie schemat części bazy danych do przechowywania informacji do zarządzania i sprawdzania uprawnień użytkowników jakiegoś programu? Czyli ten program ma wiele funkcjonalności,

Schematy SpringSecurity:
http://static.springsource.org/spring-security/site/do...

Standardowe podejście do implementacji wzorca RBAC.

Pozdrawiam.
Wojciech Kubiak

Wojciech Kubiak Ekspert ds.
Bezpieczeństwa IT i
OT

Temat: Schemat bazy dla uprawnień użytkowników

Cześć,
temat jest "odwieczny" :D
Rozwiązanie?
Z punktu widzenia ABI stworzyłbym tabelę mapowań (metadane) dla każdego systemu na jeden model (odczyt, modyfikacja, tworzenie, dostęp do danych osobowych, dostęp do danych wrażliwych...) ilość rekordów zależy od ilości regulacji, pod które podlega organizacja.
Tabela z definicjami systemów, które monitorujemy.
Tabela użytkowników (suma rekordów z systemu kadrowego i rejestru współpracowników).
Dla każdego systemu tabela z informacjami o użytkowniku i jego rolach/uprawnieniach.
Właśnie piszę pracę na ten temat ;-)



Wyślij zaproszenie do