System uprawnień w aplikacji Delphi

0

Przekopywałem szukajkę, ale nie znalazłem pokrewnego wątku.

Piszę aplikację w której potrzebne jest rozgraniczenie poziomu dostępu użytkowników do danych. Chodzi o możliwość definiowania do jakich elementów aplikacji użytkownik ma dostęp (w sensie od definiowania do jakich modułów, po definiowanie które przyciski i pozycje w menu).

Generalnie chodzi mi o podrzucenie pomysłu jak możnaby rozwiązać taki temat.

0

Ja to robię w sposób następujący.
Mam specjalny unit, w którym przechowuję stałe uprawnień. Np:

const
  RIGHT_EMPLOYEES_PRINT = 1;

Uprawnienia użytkownika przechowuję w bazie może mało profesjonalnie, ale co zrobisz. Jest to zakodowany ciąg znaków - stałych uprawnień oddzielonych przecinkami, np: 1,2,3,4,9,15
Mam klasę, która ma m.in. metodę zwracającą mi true, lub false gdy użytkownik ma dane uprawnienie, czy nie, np:

  if rightsMgr.HasRight(RIGHT_EMPLOYEES_PRINT) then
    showMessage('Masz uprawnienie')
  else
    showMessage('Nie masz uprawnienia');

Ponadto mam jeszcze jedną klasę, która ułatwia mi nadawanie uprawnień z poziomu użytkownika.
Tj. na scrollBoxie umieszcza checkBoxy, grupując je odpowiednio, a potem zwraca cały ciąg do zakodowania.

0

Rozumiem, że działa to w taki sposób, że przy próbie uruchomienia danej funkcjonalności (kliknięcia przycisku, przejścia na zakłądkę, itd.) uruchamiasz "funkcję sprawdzającą", która określa, czy dany uzytkownik ma prawo do wykonania takiej operacji czy nie.

Zgadza się ?

Jeżeli tak - to jak radzisz sobie z ukrywaniem elementów ?

Generalnie pomysł fajny, ale ja bym to zrobił ciut inaczej - owszem przesyłać do funkcji HasRight stała odnoszącą się do danego elementu, ale do bazy posyłać zapytanie w postaci: stała, user. Efekt ten sam, ale masz możliwość z poziomu bazy definiować jakie uprawnienia ma dany user.

Dobre.

W moim przypadku pozostaje jeszcze jeden kłopot - w menu okienka znajdują się procedury dynamicznie ładowane na podstawie procedur składowanych bazy danych przypisanych do danego słownika/okienka (dzięki temu mogę rozszerzać funkcjonalności programu, bez ruszania kodu aplikacji). Zastanawiam się jak taki mechanizm zastosować do takiego featuresa (W sumie - generując listę dostępnych procedur do menu, można ich RIGHT_NAME umieścic w tagu, a przy próbie wywołania przekazać do procedury sprawdzającej, która odpyta bazę pod kątem uprawnien do danego RIGHT_NAME dla danego usera).

Dzięki bardzo. Mam już materiał do przemyśleń.

EDIT: No tak, ale w Tagu nie mogę przechowywać stringów.

0

poszperaj na necie o implementacji ACL (Access Control List)

0

Nie jest tak do końca. Tzn jeśli chodzi np o elementy menu, to podczas tworzenia formy robię proste:

menuItem.enabled:=HasRight(TYP_UPRAWNIENIA);
0

Moja propozycja jak dawac uprawnienia to proponuje zapisywac cos wiecej niz 1,2,15 dobrym rozwiazaniem jest to zakodowac i trzymac w pliku jako ciag cyfr np mnozymy przez 5341...
mamy uprawnienia od 1 do 15
zal. ktos ma miec uprawnienia 1,4,6,12,14
no to zapisujemy czyjes uprawnienia 15;43; 64; 121; 14*5
kazdy wynik zapisujemy w dwoch cyfrach i laczymy 0512241270
mamy nic nie znaczacy ciag. modyfikacja jesli zostanie dokonania nieautoryzowana bedzie przypadkowa.
Jesli chodzi o zapis "stringow" ze wzgledu na tagi ktore przechowuja tylko liczby mozna korzystac z plikow np ini :) jesli to cos tematycznego a z pytania widze ze tak, lub z pamieci wysokiej tu odsylam do wskaznikow wowczas wycinamy czesc pamieci np 100 KB ilosc nie zauwazalna i tam trzymamy dane o pokazaniu lub ukrywaniu danych elementow. Oczywiscie wszystko musi sie najpierw znaleŹĆ na sztywno w programie lub pliku.

0
adydan napisał(a)

Moja propozycja jak dawac uprawnienia to proponuje zapisywac cos wiecej niz 1,2,15 dobrym rozwiazaniem jest to zakodowac

Przecież napisałem o zakodowaniu tego ciągu.
Oczywiście można zapisywać na milion sposobów, ja wpadłem na coś takiego.

0

Spokojnie. Bez nerwów.

To co mi wrzuciłeś daje mi już jakiś punkt zaczepienia. Rozwiązanie musi być i jest proste. Im bardziej skomplikowane - tym większa szansa, ze się cos (przepraszam) wydupi.

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