Mechanizm zależności pomiędzy obiektami a rolami dostępu do obiektów w systemie Mercury DB. Założeniem jest spełnienie wymagania by system posiadał zaawansowany mechanizm zarządzania uprawnianiami użytkownika do wykonywania operacji na poszczególnych typach spraw z granulacją uprawnień do poszczególnych pól obiektów spraw.
Na tej stronie:
Założenia mechanizmu uprawnień
Założenia mechanizmu:
- Możliwość nadania uprawnień do konkretnych typów spraw. W przypadku gdy rola użytkownika wymaga uprawnienia do wszystkich typów spraw, aby rozwiązać problem związany z uciążliwego definiowania wielu powiązań, wprowadza się znak
*
reprezentujący wszystkie typy dostępne w bazie danych. - Możliwość nadania uprawnień do konkretnych parametrów (pól) danego typu sprawy. W przypadku gdy rola użytkownika wymaga uprawnienia do wszystkich pól sprawy, aby rozwiązać problem związany z uciążliwego definiowania wielu powiązań, wprowadza się znak
*
reprezentujący wszystkie pola danego typu. - Występują trzy poziomy uprawnień:
RW
(read/write) – uprawnienia odczytu i zapisu wartościRO
(read only) – uprawnienia tylko do odczytu wartościWO
(write only) – uprawnienia tylko do zapisu wartości – w praktyce uprawnienie sprowadza się do możliwości tylko wprowadzania nowych danych – nie ma możliwości modyfikacji danych, gdyż modyfikacja zakłada wcześniejsze odczytanie danych i uzyskanie dostępu do ich odczytu.
- Brak uprawnień indywidualnych, bezpośrednio nadawanych użytkownikom. Uprawnienia dostępu do danych użytkownicy uzyskują za pośrednictwem posiadanych ról.
- Mechanizm nie pełni roli mechanizmu uwierzytelniającego. To systemy zewnętrzne mają realizować zadanie identyfikacji użytkownika i przypisać mu odpowiednie role. Mechanizm jedynie autoryzuje dostęp do danych, weryfikuje, czy zestaw ról posiadanych przez użytkownika spełnia wymagania dotyczące dostępu do danych.
Mechanizm uprawnień
Mechanizm uprawnień oparty jest o encje składowane w relacyjnej bazie danych:
- TypeParamRole – powiązanie typu, jego pól z uprawnieniem oraz rolą użytkownika jaką pełni.
- Role – lista ról, którym nadawane są odpowiednie uprawnienia
- Case – obiekty spraw posiadają pola informujące o tym jaka rola użytkownika została wykorzystana podczas wprowadzania zmian:
createdByRoleName
– pole z nazwą roli, którą pełnił użytkownik podczas dodawania sprawy.lastModifiedByRoleName
– pole z nazwą roli, którą pełnił użytkownik podczas modyfikacji sprawy
Kontekst operacji
Dane użytkownika, jego nazwa, nazwa roli domyślnej, oraz zestaw ról przekazywany jest do mechanizmu weryfikacji uprawnień za pośrednictwem obiektu Context
(MrcContext
). Obiekt kontekstu jest wymagany podczas wywoływania wszelkich usług SOAP/REST systemu i koniecznym jest zdefiniowanie następujących jego parametrów:
Parametr | Opis | Typ | Wymagany |
---|---|---|---|
userName | Nazwa użytkownika | String | Tak |
currentRole | Obecna rola użytkownika (potrzebne do rejestracji zespołu w ramach którego użytkownik dokonuje zmian. Wymagany w przypadku aktualizacji spraw. | String | Tak |
userRoles | Lista ról użytkownika (nazwy). Na podstawie tej listy weryfikowane są uprawnienia do wykonywania operacji/wywoływanej usługi. | Set<String> | Tak |
Przykład danych kontekstu w usłudze REST:
Algorytm działania mechanizmu
Poniżej przedstawiono algorytm działania mechanizmu:
Pobranie uprawnień użytkownika
Podczas akcji pobierania uprawnień użytkownika wykonywane są następujące operacje:
- Odczyt danych użytkownika z obiektu kontekstu żądania SOAP/REST
- Jeżeli system zewnętrzny uzyskał połączenie do usług systemu Mercury za pośrednictwem mechanizmu OAuth, weryfikowany jest zakres (lista ról) na jaki został wystawiony token sesji. Jeżeli zakres się nie zgadza zostaje zrzucony wyjątek, o braku prawidłowego token’a sesji i że trzeba go odświeżyć.
- Na podstawie danych z kontekstu pobierane są dostępne uprawnienia do typów i ich pól z encji TypeParamRole.
- Budowany jest obiekt „SecurityContext” („kontekst bezpieczeństwa”) użytkownika zawierający:
- Listę typów, do których ma prawo zapisu
- Listę typów, do których ma prawo odczytu
- Listę parametrów w powiązaniu z typami, do których ma prawo zapisu
- Listę parametrów w powiązaniu z typami, do których ma prawo odczytu
- Identyfikator kontekstu na podstawie nazwy użytkownika i zbioru jego ról. Zbudowany obiekt zostaje przesłany do pamięci podręcznej i jest wykorzystywany wielokrotnie w ramach aktywnej sesji użytkownika. Poniżej kod budowania identyfikatora:
Autoryzacja wykonywanej operacji
Na podstawie kontekstu bezpieczeństwa, w zależności od wykonywanej operacji weryfikowane są uprawnienia do wykonywania operacji na obiektach sprawy:
- Dla operacji wyszukiwania weryfikowana jest lista kryteriów wyszukiwania (czy użytkownik ma prawo do odczytu pól po których chce zrealizować wyszukiwanie), a lista znalezionych spraw prezentowana jest w zależności od tego do jakich pól użytkownik ma uprawnienia. Jeżeli kryteria wyszukiwania nie zawierają kryterium dotyczącego typu sprawy, to zostanie ono automatycznie dodane na podstawie danych składowanych w kontekście bezpieczeństwa użytkownika (nie dotyczy sytuacji gdy użytkownik ma uprawnienia do wszystkich typów spraw).
- Dla operacji pobierania obiektu sprawy:
- Czy użytkownik ma prawo do pobrania danego typu sprawy?
- Zwracane są tylko wartości tych parametrów, których użytkownik ma prawo odczytu
- Dla operacji zmiany obiektu sprawy:
- Czy użytkownik ma prawo do zapisu danego typu sprawy?
- Czy użytkownik ma prawo do zapisu danego pola typu sprawy?
TypeParamRole
Warstwy, w których użyty | Logic |
Rodzaj | Encja |
complexType | TypeParamRole |
Encja wiążąca uprawnienia z typami, nazwami ich pól oraz rolami użytkowników.
Parametr | Opis | Typ | Wymagany | Dozwolone wartości |
---|---|---|---|---|
id | Identyfikator powiązania pomiędzy rolą użytkownika a nazwą pola (Atrybutu) | Long | Tak | |
typeCode | Kod typu | String | Tak | Kody typów lub znak * oznaczający definicję uprawnień dla wszystkich typów spraw. |
paramName | Nazwa pola sprawy, z którym związane jest dane uprawnienie | String | Tak | Nazwy parametrów zdefiniowane dla encji ParamDefinition albo znak * oznaczający uprawnienia do wszystkich nazw pól wchodzących w skład typu, którego kod został podany w polu typeCode |
role | Rola użytkownika, z którą powiązane jest dane uprawnienie | Role | Tak | |
privilegeName | Nazwa uprawnienia/uprawnienie. | String | Tak | RW – odczyt/zapisRO – tylko odczytWO – tylko zapis |
publishVersion | Wersja zmieniana przy każdej aktualizacji - potrzebne do identyfikacji, czy dany wpis został już opublikowany. | String | Tak | |
createDate | Data utworzenia wpisu | Calendar | Tak | |
createdBy | Użytkownik systemowy (operator) tworzący wpis. Pole automatycznie aktualizowane na podstawie danych kontekstowych (userName) przesłanych podczas wykonywania operacji dodawania uprawnienia. | String | Tak | |
lastModifyDate | Data modyfikacji danych | Calendar | Tak | |
lastModifedBy | Użytkownik systemowy (operator) który jako ostatni zmodyfikował wpis. Pole uzupełniane automatycznie na podstawie danych kontekstowych (userName) przesłanych podczas aktualizacji/dodawania uprawnienia. | String | Tak | |
modifyComment | Komentarz dotyczący zmiany | String | Nie |
Przykład zawartości tabeli reprezentującej dane encji w relacyjnej bazie danych:
Role
Warstwy, w których użyty | Logic |
Rodzaj | Encja |
complexType | Role |
Encja ról użytkowników.
Parametr | Opis | Typ | Wymagany | Dozwolone wartości |
---|---|---|---|---|
name | Identyfikator (nazwa) roli | String | Tak | |
description | Opis roli | String | Nie |