PHP (72) - Hrátky s uživateli
Dnes se na našem výcvikovém portále naučíme odesílat zapomenutá hesla, měnit hesla a rušit uživatelské registrace.
29.11.2004 15:00 |
Petr Zajíc
| Články autora
| přečteno 57412×
Na našem výukovém hudebním portále již umíme uživatele
zaregistrovat, přihlásit jej a odhlásit. Dnes dokončíme práci na správě
uživatelů tím, že se zamyslíme nad odesíláním zapomenutého hesla,
změnou hesla a nad zrušením registrace.
Zapomenuté heslo
U zapomenutého hesla bude nejlepší, když se pokusíme
uvažovat jako uživatel. Kdy vlastně bude chtít uživatel odeslat
zapomenuté heslo? Bude to pochopitelně v momentě, kdy není přihlášen, a
pečlivým rozborem zjistíme, že to může nastat minimálně ve dvou
případech:
- když se uživatel pokusí přihlásit pod správným jménem, ale
špatným heslem
- když se uživatel pokusí znovu se registrovat na již existující
e-mail
Jak mu heslo připomeneme? Heslo je v databázi uloženo v tabulce
uzivatele společně s přezdívkou a
e-mailem, přičemž přezdívka i e-mail musejí být v rámci tabulky
uživatelů jednoznačné.
To hlídá již skript registrace.php. Takže k připomenutí hesla nám stačí
znát přezdívku nebo e-mail a
můžeme zapomětlivému uživateli jeho heslo poslat.
Uvědomme si, že aby byl celý skript trochu uživatelsky přítulný,
neměl by požadovat vyplnění většího množství informací, než je nutné. V
praxi nám postačí sestavit formulář s jedním polem, a programátorsky z
něj pak zjistit, zda obsahuje přezdívku nebo zda jde o e-mail.
Použijeme přitom
následující úvahu:
Pokud v předaném řetězci není zavináč, nemůže to být e-mail (protože to
jsme již kontrolovali při založení účtu) a budeme tudíž prohledávat
přezdívky. Na druhou stranu, pokud předaný řetězec bude obsahovat
zavináč, může to být jak e-mail, tak i přezdívka. Prohledáme nejprve
e-maily, a když nic nenajdeme podíváme se v druhém kole na přezdívky. V
každém případě vrátíme buď ID nalezeného uživatele, nebo hodnotu false
pokud se nic nenašlo.
Pozn.: Vracení ID nebo hodnoty false si
klidně můžeme dovolit, neb bezpečně víme, že žádný uživatel nemůže
mít ID rovnající se nule (což by s hodnotou false kolidovalo). Víme to
proto, že jsme v definici tabulky uživatelů nastavili automatické
číslování, a to začíná ve výchozím stavu od jedničky.
Celý skript si můžete prohlédnout zde.
Mohla by Vás tam překvapit funkce pripomenutozid, která z databáze
zjišťuje údaj o tom, zda a kdy jsme uživateli naposledy odesílali
zapomenuté heslo. My to chceme dělat maximálně jednou denně. Jak můžete
vidět, je při odeslání hesla údaj o čase do databáze ukládán jako
výsledek
funkce now().
Ta není tak dobrá, jak bychom potřebvali, protože ukládá datumy de
facto jako čísla
reprezentující řetězec. Jejich rozdíl vracíme pomocí mysql funkce
unix_timestamp, která je převede na vzájemně porovnatelná čísla.
Pozn.: Další dobré řešení je ukládat
rovnou datumy jako unixová časová razítka. Asi se ptáte, proč jsem to
neudělal. Ono to má zase nevýhodu - na první juknutí nelze tento údaj
přepočítat na datum, takže funkce se dost špatně ladí.
Navíc
může nastat situace, kdy se heslo nepřipomínalo ještě nikdy a údaj pripomenuto z tabulky
uživatelů vrátí hodnotu NULL. Hodnota NULL bude v databázi z toho
prostého důvodu, že to je výchozí hodnota a žádnou hodnotu jsme při
registraci uživatele nespecifikovali. V takovém případě samozřejmě
chceme
zapomenuté heslo odeslat.
Pozn.: Hodnota NULL se rozšiřuje skrze
výrazy. Proto si můžeme dovolit předpokládat, že rozdíl číslo-NULL =
NULL a na to náš skript spoléhá.
Zbývá jediné - vložit odkaz pro skript na ta "správná" místa. To
bude jednak při špatném přihlášení ve skriptu prihlaseni.php, kam
přidáme jeden řádek kódu:
<?
//...
if (!isset($_SESSION["id"]))
{
echo "Uživatelské
jméno a/nebo heslo nesouhlasí ";
echo "(<a
href=\"index.php?clanek=zapomenuteheslo\">připomenout
heslo</a>)";
}
else
{
$BudemeZobrazovat=false;
echo "Přihlášen ".$_POST["prezdivka"];
}
// atd...
?>
A jednak při pokusu použít existující login pro novou registraci. To
bude v souboru registrace.php v části, v níž kontrolujeme jednoznačnost
přezdívky:
<?
//...
elseif (prezdivkavdb ($_POST["prezdivka"], $link))
{
echo "Uvedená
přezdívka je již registrována ";
echo
"(<a
href=\"index.php?clanek=zapomenuteheslo\">připomenout
heslo</a>)";
}
// atd...
?>
Změna hesla
Tuto část portálu nebudeme nijak komplikovat; postačí nám, když
uživatel zadá nové heslo a odešle formulář - to provede aktualizační
skript v databázi a je to. V praxi bývá zvykem připojit ještě dvě
vychytávky, a to:
- Nové heslo se musí zadat dvakrát a skript kontroluje, zda to
souhlasí. Což je ochrana proti překlepu.
- Před zadáním nového hesla se ještě musí zadat to původní, aby se
náhodou nestalo, že přihlášený uživatel odběhne od svého stroje a
škodolibý kolega mu mezitím heslo změní.
My se spokojíme s jednoduchým formulářem, který bude uložen a
zpracováván ve skriptu zmenahesla.php.
Jediný problém je, kam odkaz na změnu hesla na stránce umístit -
prozatím jej dáme například před odkaz Odhlášení a budeme jej
zobrazovat JEN PRO PŘIHLÁŠENÉ uživatele. Změna se tedy týká souboru
navigace.php.
Mohlo by se zdát, že postačí mít "výkonný" příkaz skriptu
zmenahesla.php ve tvaru:
mysql_query
("update
uzivatele set heslo = '".$_POST["heslo"]."' where id=".$_SESSION["id"].";", $link);
a spoléhat na to, že pokud nebude bude proměnná $_SESSION["id"]
nastavena, zaktualizuje databáze nulový počet řádků. Je však lepší
"hrát na jistotu" a pojistit se podmínkou:
if
(isset($_SESSION["id"])) mysql_query ("update uzivatele set
heslo = '".$_POST["heslo"]."' where id=".$_SESSION["id"].";", $link);
protože nikdy nevíme, jak se v tomto ohledu budou chovat nově vydané
verze databází.
Zrušení registrace
Rovněž zrušení registrace uděláme jednoduché. Prostě smažeme z
databáze řádek s údaji o daném uživateli, takže se následně nebude moci
přihlásit. Musíme přitom ale dát pozor na jednu věc - uživatele musíme
rovněž odhlásit a uzavřít jeho session. Jinak by se aplikace mohla
chovat nevypočitatelně.
Celé se to provede hned ve skriptu index.php, takže zbytek stránky
již bude vědět, že uživatel není přihlášen. Ovšem odpovídající odkaz v
souboru navigace.php nepovede na zrušení registrace rovnou, nejprve
bude uživatel nasměrován na stránku, kde se ho zeptáme, zda to opravdu
myslí vážně. Pokud ano, poskytneme mu teprve odkaz na zrušení
registrace.
Pozn.: Ve firemní praxi by se
zcela určitě záznam nemazal. Namísto toho by se mu dal nějaký příznak
(např. pole DELETED), který by představoval informaci o tom, že
uživatel se odregistroval, ale záznam v databázi by se uschoval. Důvodů
je více - napadá mě statistika, bezpečnost nebo návaznost na jiná data
v systému. My si však nebudeme komplikovat život a řádek odstraníme.
Změny na portálu
Nové soubory:
Změněné soubory:
Na současný stav projektu se můžete na našem webu podívat
nebo si jej můžete stáhnout.
Pozn.: Aby Vám stažená verze
fungovala na lokálním stroji, upravte si hodnotu konstant SQL_HOST,
SQL_USERNAME, SQL_PASSWORD a SQL_DBNAME. Případně si je můžete včlenit
do konfiguračního souboru podobně, jako jsem to udělal v souboru
func.php.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|