...
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
.
Blok kódu | ||||
---|---|---|---|---|
| ||||
INT _CNT_sessions ;kontajner vsetkych aktivnych session vsetkych pouzivatelov ; metoda jrje zaregistrovana v Smart Web aplikacii ako "logOn" metoda, ; ktora sa vola po kazdej uspesnej autentifikacii RPC PROCEDURE logOn(IN TEXT _UserName, IN TEXT _UserPass, IN TEXT _X509CertificateBase64, 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 |
...