[PHP] Jak zrobić stronę dostępną na hasło tylko dla wybranych użytkowników?
Chcesz udostępnić stronę wyłącznie dla wybranych użytkowników, którzy muszą podać prawidłowy login i hasło. Nie chcesz korzystać z pliku .htaccess i innych ustawień serwera.
Aby udostępnić wybrane zasoby na hasło, musisz do przeglądarki wysłać specjalny nagłówek, który umożliwi autoryzację. Poprawna autoryzacja możliwa jest na serwerach, gdzie PHP zainstalowane zostało jako moduł serwera Apache, a nie jako CGI (dla wersji CGI opisałem w osobnej poradzie logowanie z wykorzystaniem cookie - link na końcu tekstu).
Aby dowiedzieć się czy PHP działa jako moduł Apacha czy CGI użyj funkcji phpinfo(). Na górze strony zobaczysz wartość "Server API" - jeżeli będzie "Apache" to wszystko jest OK, jeżeli "CGI" to sposób nie zadziała.
Hasła można porównywać z zawartością bazy danych aby umożliwić zalogowanie się wielu użytkowników z różnymi loginami i hasłami. Oto co musisz umieścić na stronie PHP, aby była dostępna na hasło:
<?
$login="janek";
$haslo="kowalski";
if ($_SERVER["PHP_AUTH_USER"]<>$login or $_SERVER["PHP_AUTH_PW"]<>$haslo) {
header("WWW-Authenticate: Basic realm=\"tajna strefa\"\n");
header("HTTP/1.0 401 Unauthorized\n");
echo "Brak autoryzacji!";
exit;
}
?>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html><head><meta http-equiv="content-type"
content="text/html; charset=iso-8859-2">
<title>Tajna strefa</title></head><body>
Ok, udało Ci się wejść do tajnej strefy...
</body></html>
Ważna rzecz: przed wysłaniem jakichkolwiek nagłówków na stronie nie może wystąpić nawet spacja, dlatego skrypt musi się zacząć od samej góry strony. Gdy przeglądarka wyśle jakikolwiek inny znak, nagłówki nie przejdą i logowanie się nie powiedzie.
Warunek sprawdza, czy podane zmienne $_SERVER["PHP_AUTH_USER"] i $_SERVER["PHP_AUTH_PW"] są takie same jak login i hasło. Jeżeli nie, wysyłane są nagłówki, które wyświetlają okienko z prosbą o autoryzację. Jeżeli dane się zgadzają, użytkownik jest wpuszczany i pokazywana jest strona WWW znajdująca się dalej.
Jeżeli chcesz wykonać autoryzację dla wielu osób, możesz zmodyfikować lekko skrypt:
<?
$u[]="janek|kowalski";
$u[]="piotr|michalski";
$u[]="anna|kawowska";
foreach ($u as $uzytkownik) {
$ue = explode("|", $uzytkownik);
if ($_SERVER["PHP_AUTH_USER"]==$ue[0]
and $_SERVER["PHP_AUTH_PW"]==$ue[1]) {
$ok=1;
break;
}
}
if ($ok<>1) {
header("WWW-Authenticate: Basic realm=\"tajna strefa\"\n");
header("HTTP/1.0 401 Unauthorized\n");
echo "Brak autoryzacji!";
exit;
}
?>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html><head><meta http-equiv="content-type"
content="text/html; charset=iso-8859-2">
<title>Tajna strefa</title></head><body>
Ok, udało Ci się wejść do tajnej strefy...
</body></html>
Zasada działania jest taka sama, natomiast została dodana pętla sprawdzająca, czy zalogowana osoba znajduje się w tablicy $u zaufanych użytkowników. Tablica składa się z loginu i hasła oddzielonych znakiem |.
W pętli foreach() pobierane są rekordy i rozbijane na osobne pola loginu $ue[0] i hasła $ue[1] oraz porównywane z wpisanymi. Jeżeli się zgadzają, pętla jest przerywana (break;), a zmienna $ok ustawiana jest na 1, co zapobiega ponownemu wyświetlaniu pytania o login i hasło.
Oczywiście użytkownicy mogą być też wpisaniu do pliku txt lub bazy danych, mechanizm autoryzacji wygląda wtedy podobnie.