Идентификатор пользователя в таблице сессии (DbSession)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Идентификатор пользователя в таблице сессии (DbSession)

Сообщение nepster » 2014.12.17, 22:43

Писал issue на гит, но походу меня не понял или возможно я не правильно написал, но речь не об этом, есть вот такая проблема:

Я использую вот этот компонент: https://github.com/yiisoft/yii2/blob/ma ... ession.php
для хранения сессий в базе данных.

Настройки соответственно вот такие:

Код: Выделить всё

        'session' => [
            'class' => 'yii\web\DbSession',
            // 'db' => 'db',
            // 'sessionTable' => 'session',
        ],
Все работает сессия действительно записывается в базу данных.

Проблема 1:
Если удалить сессию из базы данных пользователя не разлогинивает с сайта. У меня так работал один проект на yii1 и там при удалении
сессии и бд пользователя выбрасывало из аккаунта. Подскажите пожалуйста почему в yii2 не разлогинивает пользователя и как это сделать?

Проблема 2:
Есть задача найти сессию определенного пользователя и разлогинить его. Данные пользователя записываются в сериализованном виде в поле data, там действительно есть идентификатор пользователя, но если искать по LIKE или регулярным выражения это достаточно долго.
Тоесть нужно как-то добавлять поле user_id в таблицу сессий и записывать туда идентификатор пользователя ну и получается переопределять компонент сессий.

Как решить эту проблему без костылей ?
Последний раз редактировалось nepster 2014.12.18, 22:50, всего редактировалось 1 раз.

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.17, 22:51

1. а при удалении точно не появляется новой записи в базе? если нет, то смотрите в настройках компонента, возможно данные о логине остаются в куках
2. возьмите данные о сессии из компонента сесии или куков, должна быть связь с пользователем кроме как в поле data

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Проблема с сессиями в базе данных

Сообщение nepster » 2014.12.17, 23:58

Перепроверю настройки. Возможно сессии зависят от компонента юзер. Если сессию удалить из базы то появляется она только по ф5. В юи1 было так же только у гостей в любом случае есть сессия но без данных и их разлогинивает.

А как я возьму куки другого пользователя, чтобы его разлогинить ?

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 00:31

видимо придется переопределить компонент...

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Проблема с сессиями в базе данных

Сообщение nepster » 2014.12.18, 01:03

а это вообще хорошая практика ? Тоесть почему этого не предусмотрели изначально разработчики ?

Аватара пользователя
chungachguk
Сообщения: 427
Зарегистрирован: 2012.07.17, 11:52

Re: Проблема с сессиями в базе данных

Сообщение chungachguk » 2014.12.18, 06:21

Стало интересно, проверил у себя, проблем с сессией нет, ни с файлами, ни с БД. При удалении сессии, пользователя разлогинивает.

Аватара пользователя
chungachguk
Сообщения: 427
Зарегистрирован: 2012.07.17, 11:52

Re: Проблема с сессиями в базе данных

Сообщение chungachguk » 2014.12.18, 06:29

По второй проблеме. Может лучше в таблицу пользователя добавить поле expire и при обработке запроса проверять его и если у пользователя время истекло делать user->logout() и отправлять на страницу логина. Соответственно, чтобы разлогинить пользователя, установить ему expire в 0.

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 09:27

expire уже есть в сессии, легче туда добавить поле user_id
а таблица user и так сама по себе большая, незачем туда пихать часто обновляемые данные

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Проблема с сессиями в базе данных

Сообщение nepster » 2014.12.18, 13:14

Первая проблема решена с помощью:

Код: Выделить всё

'enableAutoLogin' => false
Походу это даже параметр по умолчанию.

Что касается второй проблемы:
http://www.yiiframework.com/doc-2.0/yii ... ram-detail

Тут есть параметр __id, который хранит в себе идентификатор пользователя, но он записывается в поле data в таблице сессий. И делать выборку по нему весьма проблематично.

Получается остается только переопределять класс сессий и добавлять после user_id, но я до сих пор не понимаю почему это не предусмотрели разработчики ?

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 15:52

напишите в github плиз, типа я хочу получать сессии других пользователей и разлогинивать их


astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 16:36

да, samdark вас не правильно понял
надо написать, что вы предлагаете feature - сохранять вместе с сессиями и user_id для поиска сессии пользователя с целью их разлогинивания в ручную.

Аватара пользователя
chungachguk
Сообщения: 427
Зарегистрирован: 2012.07.17, 11:52

Re: Проблема с сессиями в базе данных

Сообщение chungachguk » 2014.12.18, 16:51

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

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 17:07

ну говорите, раз уже начали, о чем речь?

Аватара пользователя
chungachguk
Сообщения: 427
Зарегистрирован: 2012.07.17, 11:52

Re: Проблема с сессиями в базе данных

Сообщение chungachguk » 2014.12.18, 18:29

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

Да даже тупо. Работал человек на работе, имел доступ к БД. Потом уволился. его аккаунт из системы удалили, а доступ к БД сменить забыли (всякое бывает). Зашел он туда, нашел сессию админа и сделал какую-нибудь подлянку по-тихому.

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Проблема с сессиями в базе данных

Сообщение nepster » 2014.12.18, 18:49

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

Тоесть по ситу все, что я предлагаю это достать id пользователя из поля data и организовать его в отдельном поле user_id для удобной выборки.

Аватара пользователя
chungachguk
Сообщения: 427
Зарегистрирован: 2012.07.17, 11:52

Re: Проблема с сессиями в базе данных

Сообщение chungachguk » 2014.12.18, 19:26

nepster писал(а):Тоесть по ситу все, что я предлагаю это достать id пользователя из поля data и организовать его в отдельном поле user_id для удобной выборки.
Зачем? Мне, к примеру, это из коробки не надо. Сессии по ID юзера я искать не собираюсь. Да и вообще, не правильно это как-то, чтобы разлогинить пользователя тупо грохать его сессию.

Так что переопределяй стандартный компонент сессии

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 19:34

chungachguk писал(а):
nepster писал(а):Тоесть по ситу все, что я предлагаю это достать id пользователя из поля data и организовать его в отдельном поле user_id для удобной выборки.
Зачем? Мне, к примеру, это из коробки не надо. Сессии по ID юзера я искать не собираюсь. Да и вообще, не правильно это как-то, чтобы разлогинить пользователя тупо грохать его сессию.

Так что переопределяй стандартный компонент сессии
на вас свет клином не сошелся, вот другому человеку надо это из коробочки.

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

и проблем безопасности, о которых вы выше написали не будет, т.к. помоему, вы не понимаете как в yii2 сохраняются сессии в базу.

Аватара пользователя
chungachguk
Сообщения: 427
Зарегистрирован: 2012.07.17, 11:52

Re: Проблема с сессиями в базе данных

Сообщение chungachguk » 2014.12.18, 19:41

astronin писал(а): на вас свет клином не сошелся, вот другому человеку надо это из коробочки.
Я говорю о том же самом. Разработчики должны реализовывать базовые вещи, а удобство каждый должен реализовывать сам.
astronin писал(а): и проблем безопасности, о которых вы выше написали не будет, т.к. помоему, вы не понимаете как в yii2 сохраняются сессии в базу.
Тот пример с безопасностью будет, т.к. я ради интереса посмотрел у себя на локалке. Так что мне была бы более интересна защита от подмены сессии из коробки.

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Проблема с сессиями в базе данных

Сообщение astronin » 2014.12.18, 20:40

это и есть базовая вещь и любому админу она может понадобиться
не будет проблем, если не сделать так как вы сказали, что совершенно неумно

Ответить