@gigisarri98

Где хранить аутентифицированного пользователя?

Доброго времени суток. Есть самописный mvc, аутентифицированный пользователь раньше хранился в сессии (массив со всеми данными, в т.ч email и пароль (md5)), сейчас вынес в класс с той же идеей, только каждый раз, например, при отображении шапки сайта с логином юзера, создается новый объект этого класса с запросом к бд. Так как проект учебный и количество запросов соответствующее, это не критично, однако понимаю, что это далеко не лучшая реализация аутентификации + ко всему достаточно тяжело тестировать классы, которые обращаются к UserAuth, требующий id из сессии. Подскажите, пожалуйста, наиболее оптимальное решение данного вопроса, заранее спасибо!
P.S.По поводу кода:
Класс UserAuth:
<?php
namespace App\Models;

class UserAuth extends Model
{
    public $id, $data = [];

    public function __construct()
    {
        parent::__construct();

        if ($_SESSION['user_id']) {
            $this->id = $_SESSION['user_id'];
        } else if ($_COOKIE['remember_token']) {
            $this->id = $this->getUserIdByToken($_COOKIE['remember_token']);
            $_SESSION['user_id'] = $this->id;
        }

        $user = $this->getUserInfo();

        $this->data = 
            ['id' => $user['id'], 'login' => $user['login'],
            'password' => $user['password'], 'name' => $user['name'],
            'email' => $user['email'], 'surname' => $user['surname'],
            'city_id' => $user['city_id'], 'status_id' => $user['status_id'],
            'ban_status' => $user['ban_status'], 'registration_time' => $user['registration_time'],
            'updated_at' => $user['updated_at'], 'active' => $user['active'],
            'city_name' => $user['city'], 'avatar' => $user['avatar']];
    }

    /**
	 * Get left join query with user info (from 'users', 'names', 'surnames' and 'cities')
	 * @return array
	 */

    private function getUserInfo(): array
    {
        // Здесь код, который обращается к БД через ПДО и записывает в свойство data массив через fetch()
    }

    private function getUserIdByToken(string $token): string
    {
        // Здесь код, который обращается к БД через ПДО и записывает id пользователя, найденный через токен
    }
}

Пример использования такого объекта:
<header>
                <div class="main__title"><a href="/">Главная страница</a></div>
                <?php if ($_SESSION['userauth']): ?>
                <div class="user"><a href="/user"><?= (new UserAuth)->data['login'] ?></a></div>
                <div class="logout"><a href="/logout">Выйти</a></div>
                <div class="addlot__link"><a href="/addlot">Добавить лот</a></div>
                <?php else: ?>
                <div class="login"><a href="/login">Войти</a></div>
                <div class="registration"><a href="/registration">Зарегистрироваться</a></div>
                <?php endif; ?>
            </header>
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Весь тот кусок что у вас в конструкторе перенести в контроллер, можно в базовый, можно в миддлвэйр. Работа с глобальными переменными в моделях означает что вы что-то делаете не так.
Естественно, его надо переписать, текущего пользователя внести либо в режистри (что проще, но идеологически не верно), либо передать параметром во вью, дабы на фронте можно было как-то оперировать состоянием/данными пользователя, ну и в контроллере вынести в $this.

По сути в объекте пользователя нет необходимости хранить все данные, можно вообще хранить только логин, айди, что-то часто используемое и статус залогинености, и все это кинуть либо в массив вообще, либо в стдкласс.

Хранить в сессии норм, хотя некоторые топят за постоянную актуализацию из бд, оба подхода имеют как плюсы так и минусы, расписывать долго, факт - оба подхода имеют право на жизнь, а есть варианты специфики проекта, когда подходит только какой-то один.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы