| Rubrika Php / mysql
Prihlasovanie uživateľa prostredníctvom $_SESSION
Predpokladom pre prihlasovanie užívateľov do klientskej časti webu je tabuľka, kde budú uložené dáta, pričom nevyhnutnou súčasťou je samozrejme prihlasovacie meno a heslo. Je dobré zapamätať si, že stĺpec tabuľky, ktorý využívame ako prihlasovacie menu by mal mať nad sebou index UNIQUE, ktorý zabezpečí, že v tabuľke nebudeme mať dvoch užívateľov s rovnakým prihlasovacím menom. Viac informácií o tejto problematike som už rozoberal v samostatnom článku, takže sa o tom nebudem viac rozpisovať.
Predpokladajme teda, že máme v MySQL databáze tabuľku s takouto štruktúrou.
| Name | Login | Password | ID |
|---|---|---|---|
| Fero | fero | hashhesla | 1 |
Pochopiteľne v stĺpci password ukladáme heslá užívateľov v nejakom
aspoň minimálne šifrovanom formáte :-). (md5 / sha1).
Ideálne je celý prihlasovací engine zabaliť do nejakej triedy, ktorú si incializujeme hneď v úvode index.php. Mám zabehnutú takúto štruktúru.
<? class login_management { public function loginUser() { } public function logoutUser() { } public function checkUser() { } } ?>
Myslím, že úlohy jednotlivých metód sú jasné z ich názvov. Snáď
len toľko, že metóda checkUser() je uvádzaná v každom
súbore, resp. v súbore index.php, ak predpokladáme, že to je hlavný
súbor, do ktorého sú includované podstránky, na základe napr. URL adresy.
Táto metóda skontroluje či je užívateľ prihlásený alebo nie, prípadne
ak sa užívateľ pokúša vstúpiť na chránenú podstránku, presmeruje ho na
chybovú hlášku – v prípade, že nie je prihlásený.
Poďme teraz k samotnému obsahu metód.
Metóda loginUser()
Metóda slúži na prihlásenie užívateľa – overenie zadaného mena a hesla s menom a heslom uloženým v tabuľke + nastavenie $_SESSION.
<? public function loginUser($login,$password) { // ošetrenie vstupov, vygenerovanie md5 hashu $password = md5($this->safeInput($password)); $login = $this->safeInput($login); // SQL dotaz $sql_user = " SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE login LIKE '" . $login . "' AND password LIKE '" . $password . "' LIMIT 1"; $query = mysql_query($sql_user); // zistenie počtu nájdených riadkov $count = mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0); // ak je väčší než nula, prihlásenie je úspešné if($count>0) { $row = mysql_fetch_assoc($query); // inicializujeme v superglobálnom poli pole 'logged', v ktorom su uložené ďalšie údaje o prihlásenom užívateľovi. // pole záloveň slúži ako identifikátor prihlásenia / neprihlásenia. $_SESSION['logged'] = array(); // pregenerovanie ID session, brani, tzv. session fixation session_regenerate_id(); // nastavime vsetky potrebne udaje o uzivatelovi z tabulky do $_SESSION. $_SESSION['logged']['Name'] = $row['Name']; // unixový timestamp (počet sekúnd od r. 1970) // zaznamenávame si čas prihlásenia, ktorý neskôr kontrolujeme a aktualizujeme pri každej aktivite $_SESSION['logged']['timestamp'] = time(); header("Location: http://presmerujeme_kamkolvek"); exit; // počet riadkov bol rovný nule, takže prihlásenie nebolo úspešné } else { header("Location: http://presmerujeme_kamkolvek"); exit(); } } ?>
Po vykonaní tejto metódy máme užívateľa prihláseného (za predpokladu,
že zadal meno a heslo aké mal…). Jeho prihlásenie overujeme podmienkou
existencie poľa $_SESSION[‚logged‘]:
<? if(is_array($_SESSION['logged'])) { ... } ?>
Metóda checkUser()
V tejto metóde kontrolujeme, či je užívateľ prihlásený alebo nie a zároveň aktualizujeme timestamp. Číslo 1800 v podmienkach znamená, koľko sekúnd môže byť užívateľ neaktívny. Pokiaľ bude neaktívny dlhšie, bude automaticky odhlásený. Metóda je volaná na každej podstránke.
<? public function checkUser() { // užívateľ je prihlásený, ale zároveň, čas poslednej aktivity mínus aktuálny čas // je menší než povolený limit nečinnosti (1800 s = 30 min.) if (isset($_SESSION['logged']['timestamp']) && ($_SESSION['logged']['timestamp'] < time()-1800)) { // užívateľa odhlásime $this->logoutUser(); return false; // užívateľ je prihlásený, funkcia vracia true } elseif(isset($_SESSION['logged']['timestamp'])) { $_SESSION['logged']['timestamp'] = time(); return true; } } ?>
Poslednou nutnou metódou je metóda zabezpečujúca odhlasovanie. Je veľmi
jednoduchá, založená na funkcii unset() alebo
session_destroy(). Pokiaľ použijeme
session_destroy(), zahodíme VŠETKY nastavené $_SESSION, takže
je to na zamyslenie – či ich po odhlásení potrebujeme alebo nie.
<? public function logoutUser() { session_destroy(); // alebo // unset($_SESSION['logged']); header("Location: niekam_presmerujeme"); exit; } ?>
Na záver snáď len toľko, že tu načrtnuté metódy sú len kostrou prihlasovacej triedy, na ktorú sa dajú nabaľovať mnohé prvky.
Tomáš Mašek
naspäť
prispieť do diskusie [8]
Vyhľadávanie
Posledných 5 komentárov
Viac z rubriky
Ako ochrániť includované PHP súbory?
Automatické generovanie formulárov z MySQL
Automatický prevod texu na hyperlink
Cachovanie do HTML súboru
Cachovanie s pomocou funkcií serialize/unserialize
Čiernobiele obrázky v PHP
Dynamická tvorba URL
Fulltext ako názov stĺpca v tabuľke
Getcwd – Ako ľahko získať absolútnu cestu
Import z Excelu do MySQL databázy
Maximálny timeout vykonávania SQL skriptu
Microtime – rýchlosť načítania stránky
Odstránenie diakritiky v PHP pomocou iconv()
Overovanie a kontrola formulárov v PHP
Parsovanie XML súboru v PHP
PHP a zachytenie nedoručených mailov
PHP funkcia implode
Porovnávanie a dátovy typ DATE
Práca so súbormi pri zapnutom safe_mode
Real-time kontrola e-mailovej adresy AJAX-om
Spracovanie dátového typu ENUM do HTML selectu
Strpos a offset – nájdenie výskytu znaku v reťazci
Tip: Generovanie PDF súborov
Tip: jednoduché šifrovanie a dešifrovanie v PHP
Tip: správne includovanie súborov
Ukladanie jazykových verzií statických textov
Veľmi jednoduchý návod na pekné URI
Vkladanie obrázkov do databázy
Výber záznamov začínajúcich číslom
Vyčistenie viacrozmerného poľa
Vyhľadávanie, pekné URI a diakritika
Vypísanie abecedy v PHP
Využívanie unikátnych kľúčov v MySQL databáze
Zaradenie jednej položky do viacerých kategórií
Zistenie hodnoty ďalšieho ID – autoincrement
Zložené MySQL dotazy – LEFT JOIN
Zvýrazňovanie syntaxe kódu – GeSHi
Pridať komentár



