Delphi - Felhasználói azonosítás, bejelentkezés

WebSnap 6. rész

forráskód letöltése
Következő lépésként a WebSnap-al való ismerkedésben, most az internetes felhasználóinkkal kapcsolatos teendőket nézzük át. Így például kiderítjük, miként lehet egyszerűen egy bejelentkezési oldalt létrehozni számukra, valamint az ehhez szükséges funkciókat is megvalósítani, felhasználói neveket, jelszavakat tárolni.
Hozzunk létre egy új Web App Debugger executable alkalmazást, CoClass névnél adjuk meg a Step06 sztringet, a projekt neve pedig Project6 legyen.
Hozzunk létre egy új WebSnap Page Module-t, de most ne hagyjunk mindent az alapértelmezett értékén. A megjelenő New WebSnap Page Module ablakban Producer - Type legördíthető listában az alapértelmezett komponens a PageProducer. Ezért van az, hogy amikor egy új modult létrehozunk, abban rögtön kapunk egy ilyen komponenst. Mivel most a feladatunkhoz egy AdapterPageProducer komponensre lesz szükségünk, így itt most ezt válasszuk ki. Az Ok gomb után létrejön az új modul, melyben most egy AdapterPageProducer komponenst kapunk.
Szükségünk lesz még egy LoginFormAdapter komponensre is, mely a bejelentkezési web lap kialakításához szükséges adatmezőket és akciókat tartalmazza.
Kattintsunk most duplán az AdapterPageProducer komponensen és állítsuk össze a web oldalunkat. A hierarchia AdapterPageProducer elemét választva nyomjuk le a New Item gombot és válasszunk egy AdapterForm elemet. A létrejövő AdapterForm1 objektumra kattintva ismét nyomjuk le a New Item gombot. Most egy AdapterFieldGroup elemre lesz szükségünk. Ha ez is megvan, akkor az új AdapterFieldGroup1 objektum Adapter property-jénél válasszuk ki a LoginFormAdapter1 komponenst, mint adatforrást. Ekkor az előnézeti képen rögtön látható is lesz három adatbeviteli mező: felhasználói név, jelszó, következő lap. Az első kettő önmagáért beszél, a harmadik pedig egy olyan listát fog tartalmazni, melyben felsorolásra kerülnek a web oldalunkon lévő oldalak. Ezzel a felhasználó azt tudja szabályozni, hogy a bejelentkezés után melyik oldal jelenjen meg. Alapértelmezésben mindig ugyanaz az oldal lesz látható a bejelentkezés után. Mostani példánkban ezt a lehetőséget nem használjuk ki, így tegyük a következőt: válasszuk az AdapterFieldGroup1-et, majd jobb gomb és Add Fields menüpont. A megjelenő listából a UserName és Password elemeket válasszuk ki, majd OK gomb. Ekkor létrejön két új objektum FldUserName és FldPassword névvel. Mivel a harmadik elemet nem adtuk hozzá, így az oldal választó legördíthető lista eltűnik. Hogy a két beviteli mezőnél ne UserName és Password felirat legyen olvasható, írjuk át mindegyiknél a Caption property-t.
Következő lépésként szükségünk lenne még egy bejelentkezés gombra. Ehhez a hierarchiából válasszuk az AdapterForm1 objektumot, majd a New Item gombot. A megjelenő listából válasszuk az AdapterCommandGroup elemet. Ekkor létrejön a web lapon egy nyomógomb, melyhez az AdapterCommandGroup1 objektum tartozik. A gomb felirata alapértelmezés szerint Login lesz. Gyorsan írjuk át ezt is magyarra. Ehhez válasszuk az AdapterCommandGroup1 objektumot, majd jobb gomb után az Add All Commands menüpontot. Kapunk ismét egy új objektumot CmdLogin névvel. Ennek Caption property-jét kell átírnunk, hogy a gomb felirata megváltozzon.
Ezzel a bejelentkezési web oldalunkkal készen is vagyunk, most már megjelenne, de még nem működőképes.
Ahhoz, hogy működjön is még néhány komponens felvételére lesz szükségünk, melyek kezelik a felhasználóinkat és a bejelentkezési nevüket, jelszavukat.
Ezekre azonban programunk fő moduljában van szükségünk, így térjünk át a Unit2.pas-hoz.
Tegyünk fel egy WebUserList komponenst ide. Ez a komponens fogja tárolni a felhasználóink neveit, jelszavait és jogosultságukat. Kattintsunk a UserItem property-re. Ekkor megjelenő ablakban van lehetőségünk felsorolni a felhasználóink adatait. Ezt a listát állományban is tárolhatjuk és onnan is betölthetjük. Az egyszerűség kedvéért most csak vegyünk fel két felhasználói nevet és jelszót. A hozzáférési jogokkal most nem foglalkozunk, ezekre később még részletesen visszatérünk.
Mellékelt példában felvett két név és jelszó a következő:
abc - 123 
def - 456 
Következő lépésként szükségünk lesz egy EndUserSessionAdapter komponensre is. Itt egyetlen teendőnk van: a LoginPage property-ben meg kell adnunk annak a web oldalunknak a nevét, melyen a felhasználó a bejelentkezést elvégezheti. Mellékelt példában ez az imént létrehozott AdapterPageProducerPage3 nevű WebSnap Page Module lesz. Ez az EndUserSessionAdapter1 komponens fogja a web oldalainkra elhelyezni azt script-et, mely két dolgot tesz, attól függően, hogy a felhasználó bejelentkezett-e vagy sem. Ha még nem jelentkezett be, akkor biztosít egy linket, melyre kattintva a bejelentkezési oldalra juthatunk. Ha már bejelentkezett, akkor kiír egy üdvözlő üzenetet és a felhasználó nevét, valamint egy linket, mely biztosítja a felhasználó kijelentkezését.
Végül még egy komponenst fel kell tennünk ide, mely a SessionsService lesz. Ez gondoskodik arról, hogy a bejelentkezett felhasználóinkat nyilvántartsa, elkülönítse egymástól.
Ezzel programunk kész, működőképes. Van viszont néhány apróság, amit érdemes tudni és megjegyezni. Ez pedig a SessionsService komponens működési mechanizmusával kapcsolatos.
Ez a komponens mikor kapcsolatba kerül egy felhasználóval, létrehoz egy véletlenszerű számot, mellyel azonosítja a felhasználót. Ehhez lesz hozzárendelve a bejelentkezési név és jelszó is ideiglenesen. Ezen információ a szerverünkön a futó alkalmazásunkhoz tartozó memória területen kerül elhelyezésre. A kliens oldalon pedig egy cookie-ba lesz eltárolva az azonosító, arra az esetre, ha a felhasználó rövid időn belül újabb kéréssel fordul a szerverünkhöz.
Ebből a módszerből következnek az alábbiak:
  • A felhasználónak több kérés esetén is csak egyszer kell bejelentkeznie, mivel bejelentkezés után tárolásra kerül róla az információ és a következő kérésnél már a cookie-ból származó információ alapján lesz azonosítva.
  • Ha a felhasználó oldalán, annak böngészőjében nem engedélyezett a cookie használata, akkor nem fogja tudni elérni web oldalainkat.
  • A szerver oldalon csak olyan alkalmazást készíthetünk, mely folyamatosan fut. Erre azért van szükség, mert a SessionsService a memóriában tárolja az információkat a felhasználóról és mondjuk egy CGI EXE alkalmazás a kérés kiszolgálása után befejezi futását, így a tárolt információk elvesznek. Ez esetben tehát használjunk mondjuk ISAPI DLL alkalmazást.
  • Web App Debugger executable teszt alkalmazás esetén az exe-nk szintén csak a kérés ideje alatt fut, így tesztelni sem tudnánk a készülő programunkat. Erre azonban van megoldás: a tesztelés előtt futtassuk az EXE-t, majd ezután indítsuk a böngészőnkben a kérést.
Hogy a SessionsService komponens hány felhasználót szolgál ki egyidejűleg, azt a MaxSession property-ben adhatjuk meg. -1 érték esetén nincs korlátozás.
Azt is szabályozhatjuk, hogy mennyi ideig legyen tárolva az információ a felhasználóról. Ezt a DefaultTimeout property adja meg percben. Ha egy felhasználó bejelentkezett, de a két kérése között több idő telt el, mint ami itt meg van adva, akkor újra be kell jelentkeznie, mivel a memóriából törölve lesz az őt azonosító információ.
A mellékelt példa teszteléséhez tehát nem elegendő a Web App Debugger-t elindítanunk, előtte futtassuk az EXE-t is, különben nem tudunk bejelentkezni.

WebSnap paletta cikksorozat