[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.
Sprawdź jak wygląda strona dostępna na hasło - wejdź login: "janek", hasło: "kowalski"
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) {
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.
yntylygent