Właśnie zabieram się za pisanie programu typu desktop w Qt, który będzie działał z bazą Postgresql 9.0. Najbardziej mnie frapuje ostatnio kwestia bezpieczeństwa danych. Mam parę wymyślonych rozwiązań - jestem ciekaw co Wy o tym myślicie, może macie inne koncepcje na które jeszcze nie wpadłem.

  • Stored procedures
    Idea wygląda tak: mamy bazę FOO i UZYTKOWNICY(tabela zawiera użytkownikow aplikacji) tworzymy odpowiednie funkcje do INSERT, UPDATE, DELETE, gdzie w procedurze też przekazujemy nazwę użytkownika i hasło - procedura sprawdza czy użytkownik jest uprawniony i wykonuje operację.

Plusy są takie, że będzie można łatwo wydzielić co użytkownik może a co nie. Minus jest taki że trzeba będzie pisać swój QSqlTableModel, który będzie nie pracował na tabeli a przez SP.

  • Użytkownicy bazy danych i triggery
    To rozwiązanie z kolei zakłada, że każdy użytkownik aplikacji miałby odpowiednik w bazie użytkowników bazy danych, plus tabela z użytkownikami. Tworzę role z prawami do insert, update i delete dla użytkowników na dane tabele - to pozwoli korzystać z mechanizmów QSqlTableModel bez dodatkowego kombinowania. Każdy użytkownik aplikacji byłby tworzony w bazie ale np. z prefiksem, np. prefix - xyz, więc użytkownik w bazie zwał by się xyz_marek. Dodatkowo w tabeli UZYTKOWNICY był by rekord do przechowywania ID, APP_USERNAME, DB_USERNAME - tabela by mogła się przydać do np. odtworzenia użytkowników, gdyby okazało się że nie została zrobiona kopia bazy wraz z użytkownikami db. Dodatkowo triggery można by było napisać, które służyłyby np. temu by jeden użytkownik nie skasował danych drugiemu(w trigger użyć zmiennej current_user i przyrównać do nazwy użytkownika db).

Plusy są dość spore jedyne zastrzerzenie że trzeba będzie jeszcze ogarnąć zarządzanie użytkownikami bazy z poziomu aplikacji, ale to nie powinno być bardzo uciążliwe.

Obecnie przychylam się do rozwiązania 2. Byłbym wdzięczny za sugestie. W Oracle jest takie coś jak Secure Application Role ale niestety Postgresql tego nie ma.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam