У меня есть приложение, которое использует devise для аутентификации. Rails 3 на ruby 1.9.2 с пассажиром поверх nginx.
Вот моя проблема: я заметил, что иногда мои сеансы пересекаются. Войдя в систему как один пользователь, я иногда становлюсь другим пользователем. Это действительно ужасная проблема. Мне удалось остановить его, используя хранилище сеансов active_record. Но я в тупике относительно того, где это могло произойти. Это происходит как при использовании хранилища cookie, так и при использовании хранилища memcached. Я не уверен, с чего начать отладку. Я просмотрел весь свой код, и я только читаю «current_user», а не пишу. У меня нет кода, хранящего элементы в сеансе.
Может ли кто-нибудь дать мне предложения относительно того, где или как это может происходить?
Обновление:
Я устанавливаю div в верхней части страницы, чтобы сбрасывать содержимое сеанса при каждом запросе. Это не просто переключение пользователя, это весь сеанс. Есть несколько фиктивных переменных, которые я установил в сеансе, просто чтобы посмотреть, что произойдет. Когда сеансы пересекаются (пользователь A становится пользователем B), пользователь A теперь видит фиктивные переменные, которые были у пользователя B. И Пользователь B вышел из системы.
ОБНОВЛЕНИЕ 2
Здесь я нашел еще один вопрос о переполнении стека, который описывает точно такую же проблему: other-users-session">Что в Rails может привести к тому, что у пользователя будет сеанс другого пользователя?
Кажется, это может быть проблема с пассажиром? Но что более важно, почему это вообще происходит? Это НАСТОЯЩАЯ большая проблема. Как мне положить этому конец?
ОБНОВЛЕНИЕ 3
Сейчас я использую Unicorn для обслуживания своего приложения. Я установил config.threadsafe! и начал использовать исключительно сеансы активной записи. Нет больше сеансов memcached. Проблема исчезла. По крайней мере, я могу перестать рвать на себе волосы, потому что дыра в безопасности закрыта.
Я все еще хотел бы знать, что именно было причиной этого. В большинстве туториалов показано, как настроить пассажира с методом порождения по умолчанию. Естественно, я думаю, что memcached лучше подходит для управления сессиями по сравнению с другими методами. Особенно в среде с несколькими серверами приложений.
Обновление 4
Итак, последнее и последнее обновление. Это была проблема с разветвленными процессами, использующими одно и то же соединение memcached. Я исправил это, используя клиент dalli memcached и сбросив соединение в обратном вызове after_fork либо для единорога, либо для пассажира.