Autor: Daniel Krysiak
Artykuł opisuje w jaki sposób ograniczyć dostęp do witryny użytkownikom niezalogowanym, oraz przedstawia prosty skrypt logowania oparty o bazę danych MySQL, oraz sesje (ciasteczka).
Wstęp
Zacznijmy od tego, w jaki sposób przypisać użytkownikowi status zalogowanego. Najprościej zastosować sesje. W skrócie polega to na wysłaniu użytkownikowi ciasteczka z unikatowym ID, dzięki czemu PHP pozwala tworzyć dla niego specjalne zmienne.
Opisywany skrypt wymaga:
1) Wstawiania:
<?php session_start(); ?>
na sam szczyt dokumentu. Kod ten wysyła użytkownikowi wspomniane ciasteczko;
2) Połączenia z bazą danych MySQL – o MySQL można poczytać w tutaj.
Plik ze skryptemSkrypt logowania + opis instalacji można pobrać tutaj.
Funkcja wstawiająca formularz logowania/wylogowania:
function logowanie() { if($_SESSION['logowanie'] == 'poprawne') { $string = '<FORM action="'.getenv(REQUEST_URI).'" method="post">'; $string .= ' <INPUT type="submit" name="wylogowanie" value="Wyloguj">'; $string .= '</FORM>'; } else { $string = '<FORM action="'.getenv(REQUEST_URI).'" method="post">'; $string .= '<UL style="list-style-type: none; margin: 0; padding: 0;">'; if(isset($_SESSION['logowanie'])) $string .= '<LI>'.$_SESSION['logowanie'].'</LI>'; $string .= '<LI>Login: <INPUT type="text" name="login"></LI>'; $string .= '<LI>Haslo: <INPUT type="text" name="haslo"></LI>'; $string .= '<LI><INPUT type="submit" name="logowanie" value="Logowanie"></LI>'; $string .= '</UL>'; $string .= '</FORM>'; } return $string; }
Funkcja ta wstawia formularze umożliwiające logowanie (kod po else), lub wylogowanie (przed else).
Linia 13: Skoro $_SESSION[’logowanie’] nie równa się 'poprawne’, a jednak sesja istnieje, oznacza to, że przechowywuje błąd, więc zostaje on dołączony do stringu.
'$_SESSION[’logowanie’]’ jest opisane w dalszej części artykułu.
Logowanie
if(isset($_POST['logowanie'])) { $dane = @mysql_query('SELECT login, haslo FROM uzytkownicy WHERE login = >'.$_POST['login'].'> AND haslo = >'.$_POST['haslo'].'>') or die(mysql_error()); if(mysql_num_rows($dane) == 1) { $_SESSION['logowanie'] = 'poprawne'; } else { $_SESSION['logowanie'] = 'Błędny login lub hasło!'; } unset($_POST['logowanie']); }
1. Jeśli został wysłany formularz logowania…
3. Pobierz dane z bazy. \@\ zapobiega zwróceniu ewentualnego błędu przez PHP. Funkcja mysql_query() wykonuje zapytanie do bazy danych. Konstrukcja tego zapytania zakłada, że mamy pola 'login’ i 'haslo’ w tabeli 'uzytkownicy’. Jeśli w Twojej bazie jest inaczej, zmień te nazwy. Zapytanie ma na celu zwrócenie rekordów gdzie pola login i haslo zgadzają się z danymi wysłanymi z formularza opisanego wcześniej. 'or die(mysql_error());’ zwraca błąd bazy danych, jeśli taki wystąpi.
5. Funkcja mysql_num_rows() pobiera wynik zapytania (linia 3) i zwraca liczbę informującą o ilości rekordów w tym wyniku. Jeśli użytkownik podał poprawne dane, to baza zwróci 1 rekord -> jeśli w bazie jest użytkownik opisany podanymi danymi…
6. Zaloguj go poprzez przypisanie sesji 'logowanie’ wartości 'poprawne’.
7. Jeśli w bazie nie ma takiego użytkownika…
8. Przypisz sesji 'logowanie’ wartość 'Błędny login lub hasło!’.
11. Funkcja unset() usuwa zmienną – powoduje, że przestaje istnieć. Zabezpiecza to przed ponownym wykonaniem kodu po odświeżeniu strony.
Wylogowanie
if(isset($_POST['wylogowanie'])) { unset($_SESSION['logowanie']); }
1. Jeśli został wysłany formularz wylogowania…
3. Usuń sesję 'logowanie’.
Wyznaczanie bloków dla zalogowanych i nie.
Podobnie jak zostało to zastosowane w funkcji logowanie(), tylko w sposób umożliwiający wygodne wstawienie kodu HTML.
<?php if($_SESSION['logowanie'] == 'poprawne') { ?> <!-- Jeśli zalogowany... --> <H3>Witam naszego użytkownika</H3> <?php } else { ?> <!-- Jeśli niezalogowany... --> <H3>Aby uzyskać pełen dostęp do serwisu musisz się zalogować</H3> <?php } ?>
Inne
1. Całość prezentowanego kodu należy umieścić na szczycie dokumentu.
2. Aby wstawić w odpowiednim miejscu na stronie formularz logowania wpisz:
<?php echo logowanie(); ?>
3. Jeśli chcesz by po zalogowaniu użytkownik został przeniesiony do innej strony użyj funkcji header().
Daniel Krysiak
Administratorem Twoich danych osobowych będzie Rafał Płatek, prowadzący działalność gospodarczą pod firmą CREAM.SOFTWARE RAFAŁ PŁATEK, wpisaną do rejestru ewidencji gospodarczej CEiDG pod numerem NIP 681-112-89-55. Szczegóły związane z przetwarzaniem danych osobowych znajdziesz w polityce prywatności.