Sylius API:推车在登录时发生冲突



我正在使用Sylius(Symfony SyliusBundle(作为移动应用程序的后端,我遇到了购物车冲突的问题。我正在使用带有默认sylius_shop_provider的 lexikJWT 令牌对我的用户进行身份验证。身份验证工作正常,我可以登录并检索所有用户的数据。这是问题所在: 身份验证后,我创建一个购物车,向其添加商品,一切正常。现在我注销,创建一个新用户,当我使用新创建的用户登录时,我得到了我以前用户的购物车! 我使用默认$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

Ok弄清楚发生了什么。 2件事:

1/在交互式/隐式登录时,Sylius 尝试检索现有购物车(如果用户在登录之前将项目添加到购物车,前端模式(。为此,Sylius使用了一种称为"cartContext"的东西,具有几种不同的上下文。第一个尝试根据渠道(商店名称(和客户(当前登录用户(检索购物车。如果没有返回购物车(我的情况(,它会使用另一个上下文,该上下文尝试根据通道(仍然相同(和会话检索购物车。这就是它选择错误购物车的地方,并影响了我的新用户。所以我现在有一辆手推车,它不是我的。

2/我知道它因为会话而弄错了购物车。但是我处于无状态模式,所以不应该返回任何内容,Sylius 应该为我创建一个新的,但它没有。我的新用户存在一个会话,并且看起来与最后一个用户相同。 如果在防火墙配置中设置了身份验证模式form_login Symfony似乎会启动会话,无论您这样做,它都会启动会话。

所以我们有什么:由于会话上下文,Sylius 得到了错误的购物车。Symfony确实在api登录时启动了一个会话。但是由于我使用 react native 作为前端,并且它不在 web 视图中运行,因此会话不应该相同(我没有传递任何 cookie 左右,只是通过 json Web 令牌进行身份验证,对于我的 2 个不同的用户来说,这是不同的(。即使身份验证正常,我的用户也使用更正的人员信息正确登录,他们共享相同的后端会话。这就是我不知道为什么的地方。我唯一的线索,我是因为反应本机模拟器javscript去bbuging模式,它可能使用代理并发送会话cookie。我绝对不确定,但是,为什么不:)

所以现在的解决方法,它非常丑陋/黑客:我只是设置了一个全局请求侦听器,它只侦听非 html 请求,并使会话无效。

希望它能帮助别人,我花了太多天在上面。

最新更新