Когда пользователь пытается войти в наше приложение Rails, я обращаюсь к стороннему ICAM-серверу, который возвращает некоторую информацию о пользователе, если он существует на сервере ICAM. Я получаю хэш обратно с именем пользователя, электронной почтой и т. Д. (Наша среда настроена таким образом, что сервер ICAM может обнаружить идентификацию человека, который пытается выполнить вход, на основе их учетных данных рабочей станции).Почему код обмена Rails между сеансами пользователя?
Мы делаем все это в обычном драгоценном камне. Во время процесса входа в систему я пытаюсь кэшировать информацию, которую возвращает ICAM, поэтому мне больше не нужно разговаривать с сервером ICAM. Наивно, у меня был некоторый код, который в основном делал:
module Foo
def self.store_icam_data(data)
@icam_data = data
end
def self.icam_data
@icam_data || {}
end
end
Я только что обнаружил проблему, когда два пользователя вошли в систему. Когда пользователь А регистрируется, @icam_data
задается с его информацией. Когда пользователь B входит в систему, @icam_data
задает свою информацию. В следующий раз, когда Пользователь А сделает запрос, @icam_data
имеет информацию пользователя пользователя B, а не пользователя А!
Я не ожидал, что переменная внутри этого модуля будет разделяться между потоками/сеансами, такими как. Это эффективно заставляет всех текущих пользователей системы становиться последним пользователем, который подписывает ... довольно грубую ошибку.
Может кто-нибудь объяснить, почему переменная @icam_data получает доступ к общим сеансам? Я ожидал, что данные/код будут более изолированными, чем кажется.