现在,我的Web应用程序的匿名(未经身份验证的)用户的会话数据在用户登录或注册后不会被移动/分配给用户。
例如:匿名用户与应用程序交互,创建一些会话数据(比如购物车中的产品),然后登录/注册然后注销,会话数据仍然可访问且不会移动/无法访问对于现在未经身份验证的用户。
我正在使用文件会话驱动程序(没有数据库),也许有人可以提供一些需要更改的示例(我在Session配置中假设),以便使匿名用户创建的任何会话数据都被分配给且仅一旦用户通过登录或注册进行身份验证,并且只有在用户通过身份验证时才能访问。
对此的要求是因为应用程序的用户创建了唯一的对象(与他们的user_id绑定),这些对象仅在订单处理运行时付款后保留。我将它们存储在会话中,直到用户登录/注册并完成最后的订单步骤,然后它们才会持续存在。因此,在用户注销后,我绝对不能在非认证会话中保留用户特定对象。我可以在注销时刷新会话,但理想情况下我想在用户重新登录时保留它们。
答案 0 :(得分:1)
身份验证系统仅使用会话作为存储来跨请求保持身份验证状态。但是,Laravel的身份验证系统不负责处理所有您的会话数据,它只关心存储与身份验证相关的信息,例如用户详细信息。如果要为经过身份验证的用户处理其他会话数据,则需要手动执行此操作。
逻辑很简单:
如果用户执行了某些操作,例如向购物车添加内容,则数据会保留在那里,因为会话通过Cookie绑定到请求所来自的浏览器。
如果用户从同一浏览器登录,Laravel的身份验证系统会检查凭据,如果它们是正确的,则会在同一会话中存储有关该用户的必要信息。以前存储的有关购物车的数据仍然存在并且未受影响,因此您可以在登录用户的上下文中使用它。如果此时您希望持久保存会话购物车,以便将来访问他/她的帐户时可供用户使用,则需要将详细信息存储在数据库中。以下几个步骤展示了实现这一目标的方法:
1。创建一个事件监听器,让它命名为SyncShoppingCart
,它将监听Illuminate\Auth\Events\Login
事件(命令中的双反斜杠{{转义单个斜杠需要1}}:
\\
2. 上一个命令在名为php artisan make:listener SyncShoppingCart --event=Illuminate\\Auth\\Events\\Login
的{{1}}中创建了一个文件。现在,您只需将购物车数据存储在该类的app/Listeners
方法中的用户中。下面的示例假设您有SyncShoppingCart.php
表,用于存储有关添加到购物车的商品的信息,并且您为其定义了handle
模型。此示例已简化,您需要对其进行修改以满足您的需求,但这是理解此方法的良好起点:
cart_item
3. 然后在CartItem
数组中的public function handle(Login $event)
{
// Iterate over the session cart items and
foreach (session()->get('cart') as $item) {
$cartItem = new App\CartItem();
// Set the user ID for the cart item so you know
// which user added this item to the cart
$cartItem->user_id = Auth::id();
// Set the product ID and any other properties
// you want stored for the cart item
$cartItem = $item->product_id;
// ...
// Save the cart item to the database
$cartItem->save();
}
session()->forget('cart');
}
注册偶数监听器:
app/Providers/EventServiceProvider.php
现在,只要用户登录,就会调用$listen
方法,并将会话购物车中的项目添加到数据库中。当然,在用户登录后,您应该存储添加到数据库中的新项目,仅应该使用会话来存储仅供访客使用的购物车信息。注销时,您可以从会话中删除购物车,并完成购物,知道购物车内容存储在数据库中,并可在用户下次登录时检索。
您可以在Laravel文档中详细了解Authentication Events,Sessions和Events。