Аутентификация на PHP на основе ООП

Доброго времени суток! Сегодня мы рассмотрим с Вами пример реализаци простой системы аутентификации в PHP, организованной с помощью концепций ООП. У нас будут два класса: сервис — AuthService, который будет отвечать за логику аутентификации и класс репозитория UserRepository, который будет отвечать за логику извлечение данных о пользователе (в нашем примере это будет простой список в классе, но в реальности это некототорое хранилище — база данных, например)


<?php

class AuthService 
{
    protected UserRepository $userRepository;

    public function __construct(UserRepository $userRepository) {
        $this->userRepository = $userRepository;
    }

    // kj
    public function login($username, $password) 
    {
        $user = $this->userRepository->getUserByUsername($username);

        if ($user && password_verify($password, $user['password'])) {
            $_SESSION['user_id'] = $user['id'];
            return true;
        }

        return false;
    }

    // удалаем сесссию
    public function logout() {
        unset($_SESSION['user_id']);
    }

    // проверяем, а зашел ли пользователь на сайт
    public function isLoggedIn() {
        return isset($_SESSION['user_id']);
    }

    public function getCurrentUser() 
    {
        if ($this->isLoggedIn()) {
            return $this->userRepository->getUserById($_SESSION['user_id']);
        }

        return null;
    }
}

class UserRepository 
{
    protected $users = [
        1 => ['id' => 1, 'username' => 'myrusakov', 'password' => '$2y$10$1XvZnO1UFf/6JlmzDgSPSeP2V0bQDyZLFiBz75bZv.5x63vNBY1o6'], // Пароль 'password'
        2 => ['id' => 2, 'username' => 'myrusakov2', 'password' => '$2y$10$amUgTC8HBk7aMUuFAK.uoONfsvhZwGpC1kDDvJb9WwvfnbXF4X8BO'], // Пароль 'password123'
    ];

    public function getUserByUsername($username) 
    {
        foreach ($this->users as $user) {
            if ($user['username'] === $username) {
                return $user;
            }
        }
        return null;
    }

    public function getUserById($id) 
    {
        return isset($this->users[$id]) ? $this->users[$id] : null;
    }
}

// Пример использования:
// начинаем сессию
session_start();

// создаем классы
$userRepository = new UserRepository();
$authService = new AuthService($userRepository);

// Пример входа на сайт
$username = 'myrusakov';
$password = 'password';

if ($authService->login($username, $password)) {
    echo "Вход выполнен успешно! Добро пожаловать, {$authService->getCurrentUser()['username']}!";
} else {
    echo "Неверное имя пользователя или пароль.";
}

// Проверка статуса входа - залогинен ли пользователь
if ($authService->isLoggedIn()) {
    echo "Пользователь вошел в систему.";
} else {
    echo "Пользователь не вошел в систему.";
}

// Пример выхода
$authService->logout();
echo "Пользователь вышел из системы.";

Таким образом, в коде выше:

  • AuthService обрабатывает логику входа на сайт, выхода и проверку статуса входа.
  • UserRepository обрабатывает получение данных пользователя.
  • Пароли хешируются с помощью password_hash() и сохраняются в базе данных. При проверке паролей используется password_verify().
  • Сессии используются для хранения идентификатора вошедшего в систему пользователя.
  • Источник