...
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 je 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 |
...