8.3. fejezet¶
A fejezet anyaga¶
Regisztráció és bejelentkezés¶
Ebben a részben elkészítünk egy működőképes regisztrációs és bejelentkezős rendszert. Kiegészítjük az előző fejezetben megírt regisztrációt úgy, hogy a felhasználók adatait egy szöveges fájlban tároljuk, majd megírjuk a bejelentkezést megvalósító PHP fájlt is.
Hozzuk létre a users.json
fájlt, amelyben a regisztrált felhasználók adatait fogjuk tárolni! Ez a fájl kezdetben legyen az alábbi formátumban:
1 2 3 |
|
Mivel az előző fejezetben egy felhasználót összetett adatként, egy asszociatív tömbbel reprezentáltunk, ezért a felhasználók adatait szerializált formában fogjuk tárolni az állományban. A jelszavakat a tanult módon, hashelve tároljuk.
A functions.php fájl¶
Azért, hogy a kódunk logikusabban legyen szervezve, létrehozunk egy functions.php
nevű fájlt, amibe olyan függvényeket írunk, amelyeket több másik PHP fájlban is felhasználunk.
Írjuk meg az alábbi két függvényt a fájlban:
load_users($path): array
: beolvassa a$path
elérési útvonalú fájlból a felhasználók szerializált adatait, deszerializálja azokat, és visszatér a deszerializált felhasználói adatokat tároló tömbbelsave_users($path, $users)
: elmenti a$path
elérési útvonalú fájlba a$users
tömb elemeit (az egyes felhasználók adatait) JSON formában!
Megoldás
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
A signup.php fájl¶
Keressük elő az előző fejezetben megírt signup.php fájlunkat! Írjuk át a regisztrációs űrlapot feldolgozó PHP kódot a következők szerint:
- A regisztrált felhasználók adatait a
users.json
-ből töltsük be az előbb megírtload_users()
függvény segítségével! - Sikeres regisztráció esetén fűzzük hozzá a felhasználókat tároló tömbhöz az újonnan regisztrált felhasználó adatait, majd írassuk ki a
users.json
-be a regisztrált felhasználókat asave_users()
függvénnyel!
Megoldás (A módosításokat az eredeti fájlhoz képest világossárga háttérrel jelöltük)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
A login.php fájl¶
Miután megvalósítottuk a regisztrált felhasználók adatainak elmentését, most már van értelme egy bejelentkezési űrlap elkészítésének is. Hozzunk létre egy login.php
nevű állományt, és másoljuk bele az alábbi kódot!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Írjuk meg az űrlapot feldolgozó PHP kódot! Az űrlapfeldolgozás során a következőket ellenőrizzük:
- A felhasználónevet és a jelszót kötelező legyen megadni!
- Az űrlapon megadott felhasználónév-jelszó párosnak meg kell egyeznie valamely regisztrált felhasználó felhasználónevével és jelszavával!
A regisztrált felhasználók adatait a users.json
fájlból töltsük be (load_users()
függvény)! Ha a bejelentkezés sikeres, írassuk ki a "Sikeres belépés!" szöveget, ellenkező esetben írassunk ki hibaüzenetet ($uzenet
változó)!
Megoldás
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
Átirányítás¶
PHP-ban a header()
beépített függvénnyel manuálisan is beállíthatjuk a szerver által elküldött HTTP válaszüzenet fejlécinformációit.
A gyakorlaton ezt a függvényt arra fogjuk használni, hogy a felhasználót átirányítsuk egy adott URL-re. Ezt a "Location:"
fejlécinformáció beállításával tehetjük meg.
1 2 3 |
|
Fontos, hogy az elküldött fejlécinformációknak meg kell előzniük bármilyen más elküldött tartalmat! Probléma lehet ugyanis abból, ha a header()
-t azután hívjuk meg, miután valamilyen kimenet (pl. HTML tagek, üres sorok vagy PHP által generált output) már el lett küldve.
Feladatok
- Írjuk át az imént elkészített
signup.php
állományt úgy, hogy a sikeres regisztrációt követően a felhasználó alogin.php
oldalra legyen átirányítva! - Írjuk át a
login.php
-t úgy, hogy a sikeres bejelentkezést követően a felhasználó azindex.php
nevű főoldalra legyen átirányítva! (Ha még nem létezik ez a fájl, akkor hozzuk létre!)
Megoldás
A signup.php
kiegészítése:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
A login.php
kiegészítése:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Menetkövetés¶
A webes kommunikáció során használatos HTTP egy állapotmentes protokoll. Ez azt jelenti, hogy a szerver a klienstől kapott kéréseket egymástól függetlenül kezeli, és alapból nem emlékezik az adott klienstől kapott korábbi kérések adataira.
Ez problémás lehet, ugyanis a webalkalmazásoknak folyamatos kapcsolatban kell lenniük a felhasználókkal, és a különböző kérések között is emlékezniük kell az addigi adatokra, műveletekre. Például, ha a webalkalmazásunk egyik oldalán bejelentkezik a felhasználó, egy másik oldalon pedig felhasználói beállításokat eszközöl (pl. az alkalmazás megjelenésével vagy nyelvével kapcsolatban), akkor fontos, hogy tudjunk olyan adatokat is tárolni a felhasználóról, amelyek az alkalmazásunk több oldala számára is elérhetők.
Ennek megvalósítására szolgál a menetkövetés.
A menetkövetés megvalósítási módjai¶
A menetkövetést megvalósíthatjuk:
- kliensoldalon
- rejtett űrlapmezőkkel
- URL újraírás segítségével
- böngészősütik (cookie-k) használatával
- szerveroldalon
- session segítségével.
Megjegyzés
A fenti módszerek közül a gyakorlaton a sessionnel és böngészősütikkel történő menetkövetést tárgyaljuk részletesen. A rejtett űrlapmezők használata és az URL újraírás előadáson kerül ismertetésre.
A kliensoldali technológiák esetén az adatokat a kliensgépen tároljuk. Ennek egyik nagy hátránya, hogy a kliensoldalon tárolt adatokhoz könnyen hozzá lehet férni és egyszerűen át lehet őket írni. Ha ezt meg akarjuk akadályozni, akkor tároljuk az adatokat a szerveren!
Session¶
A menetkövetés egyik lehetséges megvalósítása a session. Ennek a lényege, hogy a weboldal megnyitásakor a klienshez egy egyedi munkamenet-azonosítót (session id) rendelünk. Ezután a kliens minden HTTP kérés esetén elküldi a munkamenet-azonosítót a szervernek, a szerver pedig különféle adatokat rendelhet a felhasználóhoz az azonosító alapján.
Egy munkamenet lényegében a kliens és szerver között zajló különféle műveletek sorozata, amely általában a böngésző bezárásáig él. A munkamenet-azonosító egyértelműen azonosítja a munkamenetet és az ahhoz tartozó szerveroldali adatokat.
A munkamenet-azonosító kliensoldalon általában böngészősütiben (cookie-ban) tárolódik, viszont az URL végére írva, GET paraméterként is átadható (például ha a sütik le vannak tiltva).
Munkamenet-kezelő függvények¶
A PHP számos beépített függvényt biztosít a munkamenetek kezelésére.
A session_start()
függvény először megnézi, hogy létezik-e már egy érvényes munkamenet-azonosító (amit a szerver sütiben vagy GET/POST paraméterben megkapott). Ha talál ilyet, akkor betölti a hozzá tartozó adatokat, egyébként pedig létrehoz egy új munkamenetet.
Miután a session_start()
függvényt meghívtuk, elérhetővé válik a $_SESSION
szuperglobális tömb, amiben kulcs-érték párokként tároljuk a munkamenet-változók neveit és értékeit. Ebben természetesen új adatokat is elhelyezhetünk, például eltárolhatunk különféle információkat a bejelentkezett felhasználóról.
A session_id()
függvénnyel lekérdezhetjük a munkamenet-azonosítót.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
A session_unset()
függvénnyel kiüríthetjük a munkamenet-változókat, a session_destroy()
függvénnyel pedig törölhetjük a munkamenetet. Ezek segítségével megvalósítható a felhasználó manuális kijelentkeztetése.
1 2 3 4 5 6 |
|
A példaprojekt kiegészítése menetkövetéssel¶
Egészítsük ki a korábban elkezdett példaprojektünket menetkövetéssel!
- A bejelentkezést követően tároljuk el a felhasználó adatait tartalmazó asszociatív tömböt egy munkamenet-változóban!
- Miután a felhasználó sikeresen bejelentkezett a weboldalunkon:
- a "Bejelentkezés" oldal helyett jelenítsünk meg egy "Profilom" oldalt, ahol kilistázzuk a felhasználó adatait
- a "Regisztráció" oldalt cseréljük le egy "Kijelentkezés" opcióra!
A "Profilom" oldal csak a sikeres bejelentkezést követően legyen elérhető! Amennyiben egy nem bejelentkezett felhasználó szeretne erre az oldalra navigálni, akkor irányítsuk át a bejelentkezés oldalra!
A megoldás menete
Először kiegészítjük a login.php-t menetkövetéssel. A bejelentkezést követően a $_SESSION["user"]
fogja tárolni a bejelentkezett felhasználó adatait.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Mivel a sessionben tárolt adatokhoz a weboldal többi lapján is hozzá szeretnénk férni, ezért helyezzük el a session_start()
utasítást az index.php, login.php, logout.php és profile.php fájlok elején is!
1 2 3 |
|
Alakítsuk át a navigációt úgy, hogy a "Bejelentkezés" és "Regisztráció" opciók a nem bejelentkezett felhasználók számára legyenek láthatók! A bejelentkezett felhasználók ezek helyett a "Profilom" és a "Kijelentkezés" menüpontokat lássák!
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Valósítsuk meg a felhasználó kijelentkeztetését a logout.php állományban! A sikeres kijelentkezés után irányítsuk át a felhasználót a login.php oldalra!
1 2 3 4 5 6 7 |
|
Végezetül készítsük el a profile.php oldalt, ahol a bejelentkezett felhasználó adatait fogjuk kilistázni! Ezt az oldalt csak a sikeres bejelentkezést követően szeretnénk elérhetővé tenni, ezért még a fájl elején ellenőrizzük, hogy van-e bejelentkezett felhasználó. Amennyiben nincs, a login.php-ra navigálunk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|