Zarządzanie użytkownikami w PHP – wprowadzenie
Każda aplikacja internetowa, która oferuje personalizowane treści lub usługi, wymaga systemu zarządzania użytkownikami. System ten obejmuje proces rejestracji użytkowników, logowania, autoryzacji oraz utrzymania sesji. W tej lekcji dowiesz się, jak stworzyć kompletny system zarządzania użytkownikami w PHP z wykorzystaniem bazy danych MySQL. Zaimplementujemy rejestrację, logowanie, przechowywanie haseł w bezpieczny sposób, a także zarządzanie sesjami i autoryzacją.
Tworzenie bazy danych użytkowników
Na początku musimy stworzyć odpowiednią tabelę w bazie danych, która będzie przechowywać informacje o użytkownikach, takie jak ich nazwa użytkownika, hasło oraz e-mail. Do tego celu użyjemy narzędzia phpMyAdmin lub wykonamy zapytanie SQL w MySQL.
CREATE TABLE uzytkownicy ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL UNIQUE, email VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, data_rejestracji TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Ta tabela będzie przechowywać dane użytkowników:
- id – unikalny identyfikator każdego użytkownika,
- username – nazwa użytkownika (unikatowa),
- email – adres e-mail (unikatowy),
- password – zaszyfrowane hasło użytkownika,
- data_rejestracji – data i czas rejestracji użytkownika.
Rejestracja użytkownika
Proces rejestracji użytkownika wymaga pobrania nazwy użytkownika, adresu e-mail i hasła, a następnie zapisania tych danych w bazie. Kluczowe jest, aby hasło było odpowiednio zaszyfrowane, zanim zostanie zapisane w bazie.
1. Formularz rejestracyjny
Formularz rejestracyjny HTML, który umożliwi użytkownikowi wprowadzenie swoich danych:
<form action="register.php" method="post"> Nazwa użytkownika: <input type="text" name="username" required><br> E-mail: <input type="email" name="email" required><br> Hasło: <input type="password" name="password" required><br> <input type="submit" value="Zarejestruj"> </form>
2. Obsługa rejestracji w PHP
Poniższy kod PHP w pliku register.php
obsługuje proces rejestracji użytkownika:
<?php // Połączenie z bazą danych $conn = mysqli_connect("localhost", "root", "", "moja_baza"); if ($_SERVER["REQUEST_METHOD"] == "POST") { $username = mysqli_real_escape_string($conn, $_POST['username']); $email = mysqli_real_escape_string($conn, $_POST['email']); $password = mysqli_real_escape_string($conn, $_POST['password']); // Sprawdzanie, czy nazwa użytkownika lub e-mail już istnieje $sql = "SELECT id FROM uzytkownicy WHERE username='$username' OR email='$email'"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { echo "Nazwa użytkownika lub e-mail są już zajęte."; } else { // Szyfrowanie hasła $hashed_password = password_hash($password, PASSWORD_DEFAULT); // Wstawianie nowego użytkownika do bazy $sql = "INSERT INTO uzytkownicy (username, email, password) VALUES ('$username', '$email', '$hashed_password')"; if (mysqli_query($conn, $sql)) { echo "Rejestracja przebiegła pomyślnie!"; } else { echo "Błąd podczas rejestracji: " . mysqli_error($conn); } } } mysqli_close($conn); ?>
Wyjaśnienie:
password_hash()
: Funkcja ta służy do szyfrowania hasła. Używamy algorytmu bcrypt, który jest bezpieczny i automatycznie generuje losowy “salt”.mysqli_real_escape_string()
: Zapobiega SQL Injection poprzez oczyszczanie danych wejściowych.
Logowanie użytkownika
Proces logowania wymaga porównania danych wprowadzonych przez użytkownika z danymi w bazie danych, a następnie utworzenia sesji dla zalogowanego użytkownika.
1. Formularz logowania
Formularz HTML do logowania:
<form action="login.php" method="post"> Nazwa użytkownika: <input type="text" name="username" required><br> Hasło: <input type="password" name="password" required><br> <input type="submit" value="Zaloguj"> </form>
2. Obsługa logowania w PHP
Kod PHP w pliku login.php
, który obsługuje logowanie użytkownika:
<?php session_start(); $conn = mysqli_connect("localhost", "root", "", "moja_baza"); if ($_SERVER["REQUEST_METHOD"] == "POST") { $username = mysqli_real_escape_string($conn, $_POST['username']); $password = mysqli_real_escape_string($conn, $_POST['password']); // Wyszukiwanie użytkownika w bazie $sql = "SELECT id, username, password FROM uzytkownicy WHERE username='$username'"; $result = mysqli_query($conn, $sql); $user = mysqli_fetch_assoc($result); if ($user) { // Sprawdzanie poprawności hasła if (password_verify($password, $user['password'])) { // Zapisanie danych użytkownika w sesji $_SESSION['username'] = $user['username']; $_SESSION['userid'] = $user['id']; echo "Zalogowano pomyślnie!"; } else { echo "Niepoprawne hasło."; } } else { echo "Nie znaleziono takiego użytkownika."; } } mysqli_close($conn); ?>
Wyjaśnienie:
password_verify()
: Sprawdza, czy hasło wprowadzone przez użytkownika odpowiada zaszyfrowanemu hasłu w bazie danych.$_SESSION
: Używana do przechowywania danych o zalogowanym użytkowniku.
Autoryzacja i sesje
Autoryzacja polega na kontrolowaniu dostępu do określonych części serwisu. Zalogowani użytkownicy mają dostęp do pewnych zasobów, a niezalogowani nie.
1. Sprawdzanie, czy użytkownik jest zalogowany
Na każdej stronie, która wymaga autoryzacji, możemy sprawdzić, czy użytkownik jest zalogowany za pomocą sesji:
<?php session_start(); if (!isset($_SESSION['username'])) { echo "Musisz być zalogowany, aby uzyskać dostęp do tej strony."; exit; } echo "Witaj, " . $_SESSION['username'] . "!"; ?>
2. Wylogowanie użytkownika
Aby wylogować użytkownika i zakończyć jego sesję, możemy użyć poniższego kodu:
<?php session_start(); session_unset(); // Usuwa wszystkie zmienne sesji session_destroy(); // Zakończenie sesji echo "Zostałeś wylogowany."; ?>
Bezpieczne przechowywanie haseł
Bezpieczeństwo danych użytkowników, w tym haseł, jest kluczowe. Oto zasady bezpiecznego przechowywania haseł:
- Nie przechowuj haseł w postaci tekstowej – zawsze szyfruj hasła za pomocą funkcji takich jak
password_hash()
. - Używaj
password_hash()
ipassword_verify()
– PHP automatycznie dodaje “salt” (losowy ciąg znaków) do hasła, co czyni je bardziej bezpiecznym. - Nigdy nie odsłaniaj haseł użytkowników – w przypadku naruszenia bezpieczeństwa lepiej, aby hasła były zaszyfrowane i trudne do złamania.
Autoryzacja na różnych poziomach dostępu
Możesz również stworzyć system autoryzacji, który różnicuje uprawnienia użytkowników na różne poziomy. Na przykład, użytkownicy z uprawnieniami administratora mają dostęp do panelu administracyjnego, a inni użytkownicy mają ograniczone prawa.
1. Dodanie kolumny “role” do tabeli użytkowników
ALTER TABLE uzytkownicy ADD role ENUM('user', 'admin') DEFAULT 'user';
2. Sprawdzanie roli użytkownika przed dostępem do zasobów
<?php session_start(); if ($_SESSION['role'] != 'admin') { echo "Brak uprawnień do tej sekcji."; exit; } echo "Witaj, administratorze!"; ?>
Podsumowanie
W tej lekcji stworzyliśmy kompletny system zarządzania użytkownikami w PHP, obejmujący rejestrację, logowanie, sesje oraz autoryzację. Omówiliśmy również, jak bezpiecznie przechowywać hasła i jak zarządzać poziomami dostępu w aplikacji. Tego rodzaju system jest podstawą każdej nowoczesnej aplikacji internetowej, która wymaga personalizacji i ochrony danych użytkowników.
Gratulacje! Ukończyłeś lekcję 11.
Przejdź teraz do lekcji 12 >> Wzorce projektowe w PHP – wprowadzenie do wzorca MVC
Spis Treści - darmowy kurs PHP
Wprowadzenie: Instalacja środowiska PHP
Lekcja 1: Podstawy składni PHP
Lekcja 2: Funkcje i instrukcje warunkowe w PHP
Lekcja 3: Pętle w PHP
Lekcja 4: Tablice w PHP
Lekcja 5: Dodatkowe podstawy funkcji w PHP
Lekcja 6: Praca z formularzami HTML w PHP
Lekcja 7: Obsługa plików w PHP
Lekcja 8: Sesje i ciasteczka w PHP
Lekcja 9: Podstawy operacji na bazach danych MySQL z PHP
Lekcja 10: Prepared Statements w PHP i bezpieczeństwo aplikacji
Lekcja 11: Zarządzanie użytkownikami – rejestracja, logowanie i autoryzacja w PHP
Lekcja 12: Wzorce projektowe w PHP – wprowadzenie do wzorca MVC
Lekcja 13: Zaawansowane techniki pracy z bazami danych w PHP
Lekcja 14: Testowanie jednostkowe w PHP z PHPUnit
Lekcja 15: Tworzenie i korzystanie z API RESTful w PHP
Lekcja 16: Obsługa plików JSON i XML w PHP
Dodatki
- Spis najważniejszych funkcji PHP