Často krát je potrebné vrátiť z RPC metódy iba tie dáta na ktoré má používateľ volajúci RPC metódu oprávnenie. Posielanie userName aktuálneho používateľa ako parametra RPC metódy nie je dostatočný spôsob zabezpečenia, pretože architektúra Smart Webu nevie zabrániť prihlásenému používateľovi zavolať povolenú RPC metódu s akýmikoľvek parametrami. To znamená že používateľ by sa vedel identifikovať cez parameter userName ako niekto úplne iný. Z tohto dôvodu je potrebné identifikovať volaného používateľa spôsobmi popísanými nižšie.

Smart Web podporuje autentifikáciu cez D2000 používateľov alebo prostredníctvom aplikačne definovaných používateľov, kedy Smart Web server realizuje autentifikáciu cez volanie definovanej autentifikačnej RPC metódy.

Identifikácia D2000 používateľa v RPC metóde

V prípade že Smart Web aplikácia realizuje autentifikáciu cez D2000 používateľov je možné v akejkoľvek RPC metóde zavolať funkciu GetUserObjName, ktorá vráti userName aktuálne prihláseného používateľa.

Identifikácia aplikačne definovaného používateľa v RPC metóde

V prípade aplikačne definovaných používateľov je postup zložitejší a vyžaduje si vytvorenia kontajnera dát cez metódu CNT_CREATE, kde kľúčom k hodnotám kontajnera bude HOBJ prihlásenej session a hodnotou ku kľúču userName. Kontainer sa bude plniť volaním CNT_INSERT v tzv logon metóde, ktorú bude Smart Web volať pri každom úspešnom prihlásení. V RPC metóde je potom získanie používateľského mena realizované cez volanie CNT_GETITEM. Vzorová implementácia tejto funkcionality je uvedená nižšie. RPC metódy, ktoré potrebujú identifikovať prihláseného používateľa stačí len zavolať metódu getCurrentUserName.

INT _CNT_sessions ;kontajner vsetkych aktivnych session vsetkych pouzivatelov

; metoda je zaregistrovana v Smart Web aplikacii ako "logOn" metoda,
; ktora sa vola po kazdej uspesnej autentifikacii
RPC PROCEDURE logOn(IN TEXT _UserName, BOOL _Ok) 
  INT _hobj_session
  BOOL _bFound
  _Ok := @TRUE

  _hobj_session := %GetRPCCallerProcess()
  ; kontrola existencie session, nesmie existovat, opacny stav je chyba
  CNT_FIND _CNT_sessions, _hobj_session, _UserName, _bFound
  IF _bFound THEN
    LOGEX "ERR: uz existuje rovnaka SESSION pouzivatela: " + %IToStr(_hobj_session) PRIORITY _LOG_PRTY_ERROR
    _Ok := @FALSE
    RETURN
  ENDIF
  ; registracia volanie metody onSessionClosed pri "zmene session", 
  ; t.j. bud standardne odhlasenie alebo akekolvek ine ukoncenie session
  _Ok := %OpenRefToObject(_hobj_session, @TRUE)
  IF !_Ok THEN
    LOGEX "ERR: neznama SESSION pre otvorenie: " + %IToStr(_hobj_session) PRIORITY _LOG_PRTY_ERROR   
    RETURN
  ENDIF  
  ON CHANGE (_hobj_session) GOTO onSessionClosed
  ; vlozenie mapovania "session HOBJ -> user name" do kontainera
  CNT_INSERT _CNT_sessions, _hobj_session, _UserName  
END logOn

; zrusena session pouzivatela (odhlasenim alebo inym dovodom zrusenia session pouzivatela)
PROCEDURE onSessionClosed(IN INT _procValue, IN ALIAS _hobj, IN INT _row, _col)
  BOOL _bFound
  INT _hobj_session
  TEXT _userName
  _hobj_session := _hobj\HBJ

  CNT_FIND _CNT_sessions, _hobj_session, _userName, _bFound
  IF ! _bFound THEN
    LOGEX "ERR: neznama SESSION bola ukoncena " + %IToStr(_hobj_session) PRIORITY _LOG_PRTY_ERROR
    RETURN
  ENDIF
  CNT_DELETE _CNT_sessions, _hobj_session 
  %CloseRefToObject(_hobj_session)
  ON CHANGE (_hobj_session) GOTO onSessionClosed NONE
END onSessionClosed

; RPC metóda vráti meno aktuálne prihláseného používateľa
RPC PROCEDURE getCurrentUserName(TEXT _userName)
  INT _hobj_session
  BOOL _bFound
  _hobj_session := %GetRPCCallerProcess()  
  CNT_FIND _CNT_sessions, _hobj_session, _userName, _bFound
  IF ! _bFound THEN
    LOGEX "ERR: neznama SESSION bola ukoncena " + %IToStr(_hobj_session) PRIORITY _LOG_PRTY_ERROR
    RETURN
  ENDIF
END getCurrentUserName

BEGIN
  CNT_CREATE _CNT_sessions
END



Napíšte komentár