Kontrola dostępu do danych użytkownikaOdpowiedz

avatar
Rejestracja: 16/09/26
Posty: 42
16/09/2018, 15:34
1
Witam
Mam pytanie dotyczące Waszych najlepszych praktyk w kwestii oprogramowania dostępu użytkowników do własnych danych. Aktualnie w moich rozwiązaniach każdy dostęp do danych odbywa się za pośrednictwem procedur/funkcji PL/SQL które dla parametrów zwracają odpowiednia dane użytkownika. Każda z funkcji ma obowiązkowo przekazywany parametr z aplikacji
user => V('APP_USER')
mając id zalogowane usera procedura zwraca odpowiednie dane.

Równie dobrze zamiast parametru można użyć w procedurze
odczytu zmiennej globalnej APEX_APPLICATION.G_USER

Czy odczyt V('APP_USER') lub APEX_APPLICATION.G_USER w danej sesji będzie miał zawsze ta samą wartość i oba sposoby są równoważne ?

Moze ktoś zna inne sposoby na zorganizowanie filtrowania danych danego użytkownika np. w celu wyświetlenie tylko jego faktur, zamówień itd. Myślałem kiedyś o zastosowaniu widoków bazodanowych – tu widzę problem z danymi współdzielonymi (np. administrator będzie chciał widzieć dane pewnej grupy użytkowników) i wydajnością. Funkcje i procedura dają większe możliwości implementacji logiki niż widoki
avatar
Rejestracja: 11/09/22
Posty: 78
17/09/2018, 12:19
2
Usera chyba najlepiej odczytywać z kontekstu apexa
nvl(sys_context('APEX$SESSION','APP_USER'),user)
avatar
Rejestracja: 10/07/19
Posty: 400
18/09/2018, 08:34
3
Nie wiem czemu tak kombinujecie. Czy nie można normalnie posłużyć się:
:APP_USER - w apexie
v('APP_USER') w plsql
&APP_USER. w statycznych tekstach

Dodatkowo przestrzegam przed używaniem zmiennych apexowych wewnątrz PLSQL-a. Tzn jeżeli można to zdecydowanie lepiej podać tą zmienną w atrybucie funkcji/procedury. Używanie wewnątrz PLSQL-a zmiennych apexowych strasznie degraduje performance.
avatar
Rejestracja: 11/09/22
Posty: 78
18/09/2018, 10:36
4
https://jeffkemponoracle.com/2014/02/dont-always-call-v/
avatar
Rejestracja: 16/09/26
Posty: 42
18/09/2018, 12:01
5
Dochodzę do wniosku , że podobne efekty możemy osiągać używając komponentów nieudokumentowanych.
Jednak zaleca się stosowanie API udokumentowanego ze względu na łatwiejszą migrację aplikacji na nowsze wersje APEX-a.

Zakładam ze opisane procedury i funkcje w
https://docs.oracle.com/database/apex-18.1/AEAPI/toc.htm
należy traktować jako udokumentowane

z tego wynika wniosek ze zastosowanie
V('APP_USER') lub APEX_APPLICATION.G_USER powinno dać ten sam efekt i być jednakowo bezpieczne również w przyszłych wersjach APEX.

Zastosowanie ich może powodować jedynie różnice w wydajności co warto rozważyć przed zdecydowaniem się na któreś z rozwiązań. Mieszanie obu rozwiązań w jednej aplikacji raczej nie powinno być zalecane.
Musisz być zalogowany aby wykonać tę akcję.