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

Сегодня мы рассмотрим с Вами пример реализаци простой системы аутентификации в PHP

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

  1. <?php
  2.  
  3. class AuthService
  4. {
  5. protected UserRepository $userRepository;
  6.  
  7. public function __construct(UserRepository $userRepository) {
  8. $this->userRepository = $userRepository;
  9. }
  10.  
  11. // kj
  12. public function login($username, $password)
  13. {
  14. $user = $this->userRepository->getUserByUsername($username);
  15.  
  16. if ($user && password_verify($password, $user['password'])) {
  17. $_SESSION['user_id'] = $user['id'];
  18. return true;
  19. }
  20.  
  21. return false;
  22. }
  23.  
  24.  
  25. // удалаем сесссию
  26. public function logout() {
  27. unset($_SESSION['user_id']);
  28. }
  29.  
  30.  
  31. // проверяем, а зашел ли пользователь на сайт
  32. public function isLoggedIn() {
  33. return isset($_SESSION['user_id']);
  34. }
  35.  
  36.  
  37. public function getCurrentUser()
  38. {
  39. if ($this->isLoggedIn()) {
  40. return $this->userRepository->getUserById($_SESSION['user_id']);
  41. }
  42.  
  43. return null;
  44. }
  45. }
  46.  
  47. class UserRepository
  48. {
  49. protected $users = [
  50. 1 => ['id' => 1, 'username' => 'myrusakov', 'password' => '$2y$10$1XvZnO1UFf/6JlmzDgSPSeP2V0bQDyZLFiBz75bZv.5x63vNBY1o6'], // Пароль 'password'
  51. 2 => ['id' => 2, 'username' => 'myrusakov2', 'password' => '$2y$10$amUgTC8HBk7aMUuFAK.uoONfsvhZwGpC1kDDvJb9WwvfnbXF4X8BO'], // Пароль 'password123'
  52. ];
  53.  
  54. public function getUserByUsername($username)
  55. {
  56. foreach ($this->users as $user) {
  57. if ($user['username'] === $username) {
  58. return $user;
  59. }
  60. }
  61. return null;
  62. }
  63.  
  64. public function getUserById($id)
  65. {
  66. return isset($this->users[$id]) ? $this->users[$id] : null;
  67. }
  68. }
  69.  
  70. // Пример использования:
  71. // начинаем сессию
  72.  
  73. // создаем классы
  74. $userRepository = new UserRepository();
  75. $authService = new AuthService($userRepository);
  76.  
  77. // Пример входа на сайт
  78. $username = 'myrusakov';
  79. $password = 'password';
  80.  
  81. if ($authService->login($username, $password)) {
  82. echo "Вход выполнен успешно! Добро пожаловать, {$authService->getCurrentUser()['username']}!";
  83. } else {
  84. echo "Неверное имя пользователя или пароль.";
  85. }
  86.  
  87. // Проверка статуса входа - залогинен ли пользователь
  88. if ($authService->isLoggedIn()) {
  89. echo "Пользователь вошел в систему.";
  90. } else {
  91. echo "Пользователь не вошел в систему.";
  92. }
  93.  
  94. // Пример выхода
  95. $authService->logout();
  96. echo "Пользователь вышел из системы.";

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

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


  30.03.24 / 08:17 | PHP |   81 | 0   0