2016-03-12 3 views
4

Теперь данные сеанса для анонимных (неаутентифицированных) пользователей моего веб-приложения не перемещаются/не назначаются пользователю после их входа в систему или регистрации.Перенос анонимных данных сеанса и ограничение их на аутентифицированный пользователь

Например: анонимный пользователь взаимодействует с приложением, создает некоторые данные сеанса (например, продукты в корзине), затем регистрирует/регистрирует и затем выходит из системы, данные сеанса по-прежнему доступны и не перемещаются/не выполняются недоступный для пользователя, не прошедшего проверку подлинности.

Я использую драйвер сеанса файлов (без базы данных), возможно, кто-то может предоставить пример того, что нужно изменить (я полагаю, в конфигурации сеанса), чтобы сделать доступными данные сеанса, созданные анонимным пользователем, и доступный только этому пользователю после их аутентификации путем входа в систему или регистрации и только во время аутентификации пользователя.

Требование к этому связано с тем, что пользователи приложения создают уникальные объекты (привязанные к их user_id), которые сохраняются только после оплаты, когда выполняется обработка заказа. Я храню их в сеансе до тех пор, пока пользователь не войдет в систему/не зарегистрируется и не завершит этап окончательного заказа, и только после этого они будут сохранены. Таким образом, я абсолютно не могу иметь пользовательские объекты, сохраненные в неидентифицированных сеансах после выхода пользователя из системы. Я мог бы отключить сеанс при выходе из системы, но в идеале я хочу сохранить их, когда пользователь заходит в систему.

ответ

1

Система аутентификации просто использует сеанс как хранилище для сохранения состояния аутентификации через запросы. Тем не менее, система аутентификации Laravel не несет ответственности за обработку данных сеанса, но только для хранения данных, связанных с проверкой подлинности, таких как данные пользователя. Если вы хотите обрабатывать дополнительные данные сеанса для аутентифицированных пользователей, вам нужно сделать это вручную.

Логика проста:

  • Если пользователь делает какое-то действие, как-то добавить в корзину покупок, данные остаются там, как сеанс связан через куки в браузере, из которого приходят запросы из.

  • Если пользователь входит в систему из того же браузера, система проверки подлинности Laravel проверяет учетные данные и, если они верны, она хранит необходимую информацию об этом пользователе в том же сеансе. Ранее сохраненные данные о корзине покупок все еще существуют и нетронутыми, поэтому вы можете использовать их в контексте зарегистрированного пользователя. Если в этот момент вы хотите сохранить корзину сеанса, чтобы она была доступна для пользователя, когда он будет получать доступ к своей учетной записи в будущем, вам необходимо сохранить данные в базе данных. Ниже приведены несколько шагов, демонстрирующих способ для достижения этой цели:

1. Создание приемника событий, давайте назовем его SyncShoppingCart, что будет слушать Illuminate\Auth\Events\Login события (двойные обратные косые в команде \\ необходимы чтобы избежать одного слэш):

php artisan make:listener SyncShoppingCart --event=Illuminate\\Auth\\Events\\Login 

2. предыдущая команда создала файл с именем app/ListenersSyncShoppingCart.php. Теперь вам просто нужно сохранить данные корзины у пользователя в методе handle этого класса. В приведенном ниже примере предполагается, что у вас есть таблица cart_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. Затем зарегистрировать даже слушателя в app/Providers/EventServiceProvider.php в $listen массиве :

protected $listen = [ 
    ... 
    'Illuminate\Auth\Events\Login' => [ 
     'App\Listeners\SyncShoppingCart', 
    ], 
]; 

Теперь, когда пользователь входит в систему, метод App\Listeners\SyncShoppingCart::handle будет называться и добавит элементы из сеанса телеге в базу данных. Конечно, после регистрации пользователя вы должны также хранить новые элементы, добавленные в базу данных, только сеанс должен использоваться для хранения информации о корзине только для гостей. На выходе из системы можно удалить тележку из сессии и сделать с ней, зная, что содержимое корзины сохраняются в базе данных и могут быть получены в следующий раз, когда пользователь входит в систему.


Вы можете прочитать больше о Authentication Events, Sessions и Events в Laravel Docs.

+0

Я не просто хочу удалить данные сеанса телеграммы после выхода из системы аутентифицированного пользователя. Я хочу, чтобы он оставался, но теперь ТОЛЬКО доступен для этого пользователя, когда они снова аутентифицируются/регистрируются. Таким образом, если анонимный пользователь добавляет продукты в корзину, а затем регистрирует/проверяет подлинность и затем выходит из системы, данные сеанса остаются, но теперь доступны только для этого пользователя при их аутентификации. Аналогично, если пользователь, прошедший проверку подлинности, добавляет продукты в корзину и затем выходит из системы, все данные сеанса для тележки остаются, но доступны только после входа пользователя в систему. – LaserBeak

+0

Я думаю, что вы можете не понимать, как работают сеансы. Сеансы временны и хороши только для хранения информации, когда пользователь просматривает веб-сайт, и, как я упоминал в своем ответе, сеанс привязан к браузеру. Поэтому, даже если вы установили, что сеансы истекают через 10 лет (не очень хорошо), и вы сохранили информацию в этом сеансе, она будет работать только в одном браузере, который содержит идентификатор сеанса в cookie, если пользователь вошел в систему с та же учетная запись из другого браузера, что сеанс не будет доступен. Если вы хотите сохранить информацию о корзине, которую необходимо сохранить в базе данных. – Bogdan

Смежные вопросы