Sylius API: конфликт тележек при входе в систему

Я использую Sylius (Symfony SyliusBundle) в качестве серверной части с мобильным приложением, и у меня возникла проблема с конфликтом тележек. Я использую токен lexikJWT с sylius_shop_provider по умолчанию для аутентификации моих пользователей. Аутентификация работает нормально, я могу войти в систему и получить все данные моего пользователя. Вот в чем проблема: После аутентификации я создаю корзину, добавляю в нее товары, все работает нормально. Теперь я выхожу из системы, создаю нового пользователя, и когда я вхожу в систему с новым созданным пользователем, я получаю корзину моего предыдущего пользователя! Я использую $this->get('sylius.context.cart')->getCart(); по умолчанию для создания или получения корзины, но customer_id заказа изменился после входа в систему. Понятия не имею, почему, ни документа, ничего. Я только что проверил код sylius, и что-то должно быть связано с этим: Существует слушатель под названием CartBlamerListener, который переопределяет клиента корзины, если он существует:

private function blame(ShopUserInterface $user)
{
    $cart = $this->getCart();
    if (null === $cart) {
        return;
    }

    $cart->setCustomer($user->getCustomer());
    $this->cartManager->persist($cart);
    $this->cartManager->flush();
}

Кажется, что он находит уже существующую корзину (тележку моего предыдущего пользователя) и заменяет поле клиента полем нового пользователя, но этого не должно быть !!!

Есть идеи, что происходит?

Ниже мой файл безопасности:

api_login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        form_login:
            provider: sylius_shop_user_provider
            check_path:               /api/login_check
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure
            require_previous_session: false

    api:
        pattern:   ^/api
        anonymous: true
        stateless: true
        provider: sylius_shop_user_provider
        guard:
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
440
1

Ответы 1

Хорошо разобрался в чем дело. 2 вещи:

1 / При интерактивном / неявном входе в систему Sylius пытается получить существующую корзину (если пользователь добавил элементы в корзину до входа в систему, режим внешнего интерфейса). Для этого Силиус использует нечто, называемое «cartContext», с несколькими разными контекстами. Первый пытается получить корзину на основе канала (название магазина) и покупателя (текущего пользователя, вошедшего в систему). Если корзина не возвращается (мой случай), он использует другой контекст, который пытается получить корзину на основе канала (все тот же) и сеанса. И именно здесь он выбрал не ту корзину и повлиял на нее для моего нового пользователя. Итак, теперь у меня есть тележка, которая изначально не моя.

2 / Я знаю, что он получил неправильную корзину из-за сеанса. Но я нахожусь в режиме без сохранения состояния, поэтому ничего не нужно возвращать, и Силиус должен был создать для меня новый, но этого не происходит. Для моего нового пользователя существует сеанс, который выглядит таким же, как и последний пользователь. Кажется, что Symfony запускает сеанс, если в конфигурации брандмауэра установлен режим авторизации form_login, независимо от того, что вы делаете, он запускает сеанс.

Итак, что мы имеем: Sylius получает неправильную корзину из-за контекста сеанса. Symfony действительно запускает сеанс при входе в систему через api. Но поскольку я использую response native в качестве внешнего интерфейса, и он не работает в веб-просмотре, сеанс не должен быть таким же (я не передаю никаких файлов cookie или около того, просто авторизуйтесь через веб-токен json, и он отличается для моих двух разных Пользователи) .Даже если авторизация в порядке, мой пользователь правильно вошел в систему с исправленной личной информацией, они используют один и тот же бэкэнд-сеанс. И именно здесь я не понимаю почему. Единственный ключ, который у меня есть, я из-за режима отладки javscript встроенного симулятора реакции, который может использовать прокси и отправлять cookie сеанса. Я в этом абсолютно не уверен, но почему бы и нет :)

Итак, теперь обходной путь, и он очень уродливый / хакерский: я просто установил глобальный прослушиватель запросов, который прослушивает только запросы, отличные от HTML, и аннулирую сеанс.

Надеюсь, это может помочь кому-то другому, я потратил на это слишком много дней.

Другие вопросы по теме