vitovt
@vitovt

Стоит ли хранить данные о пользователе в сессиях?

И собственно вопрос как лучше это делать.

Т.е к примеру я авторизую пользователя на сайте, создаю сессию и ее ID записываю в куку.

Далее, у пользователя есть куча данных, его логин, ID, ID всех городов, стран и областей проживания, его почта, теелфон и т.д. Все это может хранится в нескольких таблицах. Доступ к этим данным необходим если не на каждой странице то очень часто и везде дергать MySQL выбирая нужные данные, пускай и универсально, не очень хочется.

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

Т.е писать в таблицу:

session_id | serialize_data

или иначе как-то?

Все на любимом РНР )
  • Вопрос задан
  • 7498 просмотров
Пригласить эксперта
Ответы на вопрос 5
То есть дублировать данные в БД, реализовав собственный механзим сохранения сессионных данных? Имхо, не стоит, если нет каких-то очень специфических требований — или дёргайте БД при каждом запросе или дёргайте её только при аутентификации и пользуйтесь стандартными средствами сессий для сохранения полученных из БД данных для дальнейшего использования
Ответ написан
@yaidiot
1. Данные сессии — временные, отталкивайтесь от этого.
2. В вопросе, судя по всему, речь идет о постоянных данных — их хранить в профилях пользователей в базе.
3. Если не хотите каждый раз дергать базу, хотя в этом нет ничего плохого, делайте кеширование.
4. В PHP есть встроенный механизм сессий, свой изобретать не нужно. Бекэнды могут быть разные — файлы, БД, memcached, можно реализовать свой.
Ответ написан
schursin
@schursin
Зачем? Если, я почти уверен, эти же данные хранятся в таблице рядом. Храните только информацию которая позволит узнать пользователя и его незавершенную сессию, а как следствие и восстановить данные в $_SESSION Вашего приложении.
Ответ написан
Angelina_Joulie
@Angelina_Joulie
Думаете вы в верном направлении, вот только с сессией чуток ошиблись.
Почему забыли?

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

Предлогаю использовать следующее:
Создать статический класс (думаю это возможно в PHP. В .NET за это отвечает System.Threading.Thread.CurrentPrincipal). И данные текущего пользователя складывать именно в значение свойства статического класса. (Да, есть возможность не санкционированной подмены данных, но с другой стороны можно проводить имперсонализацию (impersonation). А само значение организовать ввиде структуры, которая бы могла быть сериализирована.

Сериализация этой структуры нужно для того, что бы после этого результат шифровать (там есть свои нюансы) и ввиде ОТДЕЛЬНОЙ Cookie складывать на сторону пользователя. А при запросе проверять значение cookie, и востанавливать значение свойства вышеозначеного статического класса.

Подобный подход упростит вам аутентификацию пользователя после перезапуска приложения (ведь сессия — это объект в памяти).

Важные моменты:
1. Не корректное использование шифрования, может привезти к проблемам с безопасностью (значение зашифрованых данных можно сохранить и вторично использовать)
2. Не забыть про синхронизацию данных и учитывать момент того, что во время работы могут быть моменты когда данные рассинхронизированы
(Кто-то в базе уже поменял, а пользователь всё ещё использует старый набор данных. Лечить можно login/logout, если «влоб»).

Будут вопросы, обращайтесь.
Ответ написан
Anonym
@Anonym
Программирую немного )
Авторизовали — Получили из БД все необходимые данные — Записали их в $_SESSION — До выхода пользователя с сайта дёргайте $_SESSION
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Etton Казань
от 100 000 ₽
Смокинг Казань
от 120 000 до 150 000 ₽
Plesk Новосибирск
от 150 000 до 300 000 ₽
17 сент. 2021, в 01:51
220000 руб./за проект
17 сент. 2021, в 01:46
10000 руб./за проект
10 сент. 2021, в 14:58
200 руб./в час