Č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
Pridať komentár