|
System logowania
Zdarza się, że niektóre
dane na naszej stronie nie powinny być oglądane
przez osoby postronne. Najlepszym sposobem,
aby uchronić się przed taką ewentualnością
jest stworzenie systemu logowania i o tym będzie
traktował niniejszy artykuł.
Pobierz
gotowy plik (10kb)
Na początku będziemy
potrzebowali zbioru użytecznych funkcji (plik
[func.php]). Do tych najbardziej
potrzebnych zaliczają się:
-
login($login, $passwd)
- logowanie użytkownika
-
logout() -
wylogowanie użytkownika
-
auth() -
sprawdza czy użytkownik jest zalogowany
-
user_exists($login)
- sprawdza czy użytkownik istnieje już w
naszej bazie (plik [users.dat])
-
add_user($login, $passwd)
- rejestruje nowego użytkownika, dodaje
wpis do pliku [users.dat]
<?php
#definicje
stalych
define("DATA",
"users.dat");
define("SESID",
SESSION_NAME()
. "=" .
SESSION_ID());
# zaloguj user-a
function login($login,
$passwd)
{
$line
= file(DATA);
foreach($line
as $temp)
{
$str
= explode(",",
$temp);
if(chop($str[0])==$login
&& chop($str[1])==$passwd)
{
$_SESSION["USER_AUTH"] =
True;
$_SESSION["USER_LOGIN"]
= $_POST["login"];
return True;
}
}
$login
= htmlentities($login);
return False;
}
# wyloguj user-a
function logout()
{
$_SESSION["USER_AUTH"] =
False;
$_SESSION["USER_LOGIN"]
= Null;
}
# czy użytkownik
istnieje
function user_exists($login)
{
$line
= file(DATA);
foreach($line
as $temp)
{
$str
= explode(",",
$temp);
if(chop($str[0])==$login)
return True;
}
return False;
}
# dodaje nowego użytkownika
function add_user($login,
$passwd)
{
$files
= fopen(DATA,
"a");
flock($files,
2);
fputs($files,
$login .
"," .
$passwd .
"\n");
flock($files,
3);
fclose($files);
}
# sprawdz czy
zalogowany
function auth()
{
return ($_SESSION["USER_AUTH"]
== True);
}
?>
Stała DATA
definiuje ścieżkę dostępu do pliku z hasłami,
plik ten powinien znajdować się w katalogu
niedostępnym dla zwykłego zjadacza chleba
np. może to być katalog PRIVATE
lub, tak jak u mnie, nad katalogiem PUBLIC_HTML.
W ostateczności możesz go zapisać w
katalogu razem z resztą plików, hasła są
kodowane więc ewentualny podgląd pliku
niewiele komuś pomoże. Jeśli zajdzie taka
potrzeba, należy ustawić prawa dostępu do
pliku "users.dat" na
644. Najbardziej sympatyczna jest funkcja auth(),
dzięki której wiadomo czy ktoś jest
zalogowany czy nie. Funkcja logout()
natomiast powoduje wylogowanie użytkownika.
Te dziwnie wyglądające
napisy $_SESSION[*] to nic innego
jak zmienne sesyjne, które są dostępne
przez cały czas trwania sesji. $_SESSION["USER_LOGIN"]
zawiera nazwę użytkownika, a $_SESSION["USER_AUTH"]
mówi nam czy użytkownik jest zalogowany czy
też nie (true, false).
Następne funkcje służą
odpowiednio do: sprawdzenia czy użytkownik
istnieje w bazie i dodawania nowego użytkownika.
W nagłówku pliku "index.php"
(na samym początku) należy umieścić
skrypt, który w odpowiednim momencie wywoływałby
te funkcje. Oprócz tego powinien załadować
bibliotekę z funkcjami i startować sesję.
Tak wygląda ten skrypt: [plik: session.php]
<?php
# start sesji
session_start();
# biblioteka z
funkcjiami
include "func.php";
# logowanie,
wylogowanie itp
switch ($page)
{
case "login" :
$login =
htmlentities(substr($_POST["login"],
0,
255));
$passwd
= htmlentities(substr($_POST["passwd"],
0,
255));
login($login,
md5($passwd));
break;
case "logout"
: logout();
break;
}
?>
Jak widać skrypt ten wywołuje
odpowiednie funkcje w zależności od zawartości
zmiennej $page.
Zmienna ta zawiera nazwę
pliku (bez rozszerzenia) która ma być dołączona
w prawej komórce tabeli (plik: "index.php").
Przed dołączeniem zostaje dodane
rozszerzenie ".php".
Przykładowy link wygląda następująco: <a
href="index.php?page=nazwa_pliku"></a>.
Formularz także musi przypisać jakoś wartość
zmiennej $page w przeciwnym razie
nie można byłoby wywołać odpowiednich
funkcji.
Formularz [plik: login.frm]
<form
action="index.php" method="post">
<input type="hidden" name="page"
value="login">
<input type="hidden" name="<?=SESSION_NAME()?>"
value="<?=SESSION_ID()?>">
Login<br>
<input type="text" name="login"
value="<?=$_POST["login"]?>">
<br>
Haslo<br>
<input type="password" name="passwd"
value="">
<input type="submit" name="submit"
value="Loguj">
</form>
Mając te wszystkie funkcje
jesteśmy w stanie zrobić już prawie
wszystko co jest związane z logowaniem i
rejestracją użytkownika.
Aby wyświetlić dowolny
tekst dla użytkownika tylko zalogowanego
wystarczy użyć funkcji auth().
Np:
<?php
if auth()
print "Jesteś
zalogowany " .
$_SESSION["USER_LOGIN"];
?>
$_SESSION["USER_LOGIN"]
zwraca nazwę zalogowanego użytkownika.
Logowanie też wygląda
prosto:
login(jakiś_login,
md5(hasło)) gdzie funkcja md5()
koduje hasło, następnie funkcja poszukuje użytkownika
w pliku [users.dat]. Jeśli użytkownik
istnieje i hasło jest poprawne funkcja zwraca
True. Należy zaznaczyć, że
funkcja login() nie służy nam
do sprawdzania czy użytkownik jest zalogowany,
do tego celu służy funkcja auth().
Udostępniłem też możliwość
rejestracji nowych użytkowników. Funkcja add_users(login,
hasło) dodaje nowego użytkownika
konta, a funkcja user_exists(login)
sprawdza czy przypadkiem przyszły użytkownik
nie znajduje się w naszej bazie.
Plik do rejestracji [registration.php]
wygląda następująco:
<?php
$result = False;
if($submit)
{
if(!$login
|| !$passwd)
{
echo "<p
class=error align=center>Wszystkie pola są
obowiązkowe.</p>\n";
}
elseif(!eregi("^[_[:alnum:]-]{1,10}$",$login))
{
echo "<p
class=error align=center>Nieprawidłowy
login.</p>\n";
}
elseif(!eregi("^[_[:alnum:]-]{3,10}$",$passwd))
{
echo "<p
class=error align=center>Niepoprawne hasło.</p>\n";
}
elseif(user_exists($login))
{
echo "<p
class=error align=center>Login \"$login\"
jest już zajęty.</p>\n";
}
else
{
$result
= True;
//
formatuje wprowadzone dane
$login
= strtolower($login);
add_user($login,
md5($passwd));
//
informacjie o nowym koncie
echo
"<p class=ok
align=center>Konto zostało
utworzone.</p>\n";
echo "Jeśli
zapomnisz hasło to koniec :-), wszystkie hasła
są kodowane. ";
echo "Możesz
teraz się zalogować i przetestować
konto.";
}
}
if(!$result)
{
//
usuwa tagi html z formularza
$login =
htmlentities(substr($_POST["login"],
0,
255));
include "registration.frm";
}
?>
Pobierz
gotowy plik (10kb)
Autor
Mariusz Kacki
<== WSTECZ
=
|