Php 迁移匿名会话数据并将其限制为经过身份验证的用户

Php 迁移匿名会话数据并将其限制为经过身份验证的用户,php,laravel,laravel-5,Php,Laravel,Laravel 5,现在,我的web应用程序的匿名(未经身份验证)用户的会话数据在登录或注册后不会移动/分配给该用户 例如:匿名用户与应用程序交互,创建一些会话数据(例如购物车中的产品),然后登录/注册,然后注销,会话数据仍然可以访问,并且不会被移动/使未经身份验证的用户无法访问 我正在使用文件会话驱动程序(没有数据库),也许有人可以提供一些需要更改的示例(我假定在会话配置中)为了使匿名用户创建的任何会话数据在该用户通过登录或注册进行身份验证后,且仅在该用户通过身份验证时,才分配给该用户并可供其访问 这是因为应用程

现在,我的web应用程序的匿名(未经身份验证)用户的会话数据在登录或注册后不会移动/分配给该用户

例如:匿名用户与应用程序交互,创建一些会话数据(例如购物车中的产品),然后登录/注册,然后注销,会话数据仍然可以访问,并且不会被移动/使未经身份验证的用户无法访问

我正在使用文件会话驱动程序(没有数据库),也许有人可以提供一些需要更改的示例(我假定在会话配置中)为了使匿名用户创建的任何会话数据在该用户通过登录或注册进行身份验证后,且仅在该用户通过身份验证时,才分配给该用户并可供其访问


这是因为应用程序的用户创建了唯一的对象(绑定到他们的用户id),这些对象仅在订单处理运行时在付款后才会持久化。我将它们存储在会话中,直到用户登录/注册并完成最终订单步骤,然后才将它们持久化。因此,在用户注销后,我绝对不能让特定于用户的对象保留在未经身份验证的会话中。我可以在注销时刷新会话,但理想情况下,我希望在用户重新登录时保留会话。

身份验证系统只是将会话用作存储,以便在请求之间保持身份验证状态。但是,Laravel的身份验证系统不负责处理所有会话数据,它只关心存储与身份验证相关的信息,如用户详细信息。如果要为经过身份验证的用户处理额外的会话数据,则需要手动执行该操作

逻辑很简单:

  • 如果用户执行某些操作,如向购物车添加内容,则当会话通过cookie绑定到请求来自的浏览器时,数据将保留在那里

  • 如果用户从同一浏览器登录,Laravel的身份验证系统将检查凭据,如果凭据正确,它将在同一会话中存储有关该用户的必要信息。以前存储的关于购物车的数据仍然存在且未被触及,因此您可以在登录用户的上下文中使用它。如果此时您希望持久化会话购物车,以便用户将来访问其帐户时可以使用它,那么您需要将详细信息存储在数据库中。以下是实现这一目标的几个步骤:

1.创建一个事件侦听器,我们将其命名为
SyncShoppingCart
,它将侦听
illighted\Auth\Events\Login
事件(需要命令
\\
中的双反斜杠来转义单斜杠):

2。上一个命令在
app/Listeners
中创建了一个名为
SyncShoppingCart.php的文件。现在,您只需要将购物车数据存储在该类的
handle
方法中的用户数据库中。下面的示例假设您有一个
cart\u item
表,该表存储了有关添加到购物车中的项目的信息,并且您为其定义了一个
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');
}
3.然后在
$listen
数组中的
app/Providers/EventServiceProvider.php
中注册偶数侦听器:

protected $listen = [
    ...
    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\SyncShoppingCart',
    ],
];
现在,每当用户登录时,将调用
App\Listeners\SyncShoppingCart::handle
方法,并将会话购物车中的项目添加到数据库中。当然,在用户登录后,您也应该存储添加到数据库中的新项目,会话本身应该用于存储购物车信息,仅用于客人。注销时,您可以将购物车从会话中删除并使用它,因为您知道购物车内容存储在数据库中,可以在用户下次登录时检索



您可以在Laravel文档中阅读更多关于和的信息。

我不希望在经过身份验证的用户注销后删除购物车会话数据。我希望它保持不变,但现在仅当该用户再次验证/登录时才可访问。因此,如果匿名用户将产品添加到购物车中,然后登录/验证,然后注销,会话数据将保留,但现在只有在对其进行验证时,该用户才能访问会话数据。类似地,如果经过身份验证的用户将产品添加到购物车,然后注销,购物车的所有会话数据将保留,但只有在用户重新登录后才能访问。我认为您可能误解了会话的工作方式。会话是暂时的,只在用户浏览网站时擅长存储信息,正如我在回答中提到的,会话绑定到浏览器。因此,即使您将会话设置为10年后过期(这不是一件好事),并且您在该会话中存储了信息,它也只能在一个浏览器中工作,该浏览器将会话ID保存在cookie中,如果用户使用同一帐户从另一个浏览器登录,则该会话将不可用。如果要持久保存购物车信息,需要将其存储在数据库中。
protected $listen = [
    ...
    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\SyncShoppingCart',
    ],
];