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