Lekcja 11 – Zarządzanie użytkownikami – rejestracja, logowanie i autoryzacja w PHP

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ł:

  1. Nie przechowuj haseł w postaci tekstowej – zawsze szyfruj hasła za pomocą funkcji takich jak password_hash().
  2. Używaj password_hash() i password_verify() – PHP automatycznie dodaje “salt” (losowy ciąg znaków) do hasła, co czyni je bardziej bezpiecznym.
  3. 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