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

Сегодня мы рассмотрим с Вами пример реализаци простой системы аутентификации в 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().
- Сессии используются для хранения идентификатора вошедшего в систему пользователя.


  30.03.24 / 05:17 | PHP |   176 | 0   0