Непреднамеренная ошибка перехвата сеанса с повторной аутентификацией - PullRequest
10 голосов
/ 28 сентября 2008

Я использую текущую версию restful_authentication, найденную на github, и у меня куча странных сессионных проблем. Сервер, похоже, каким-то образом назначает сессии пользователям, чего не должно быть. Это происходит только при пересечении барьера, в котором произошел выход из системы.

Вот пример. Когда на сервере нет активных сеансов, я захожу в учетную запись с пользователем A. На другом компьютере я захожу с пользователем B. Затем при выходе из пользователя B, через некоторое время после перенаправления выхода из системы, я войду в систему как пользователь A. С этого момента я могу продолжать перемещаться по сайту, как если бы я вошел как этот пользователь! Что-то, что я наблюдал через журналы, это то, что когда происходит этот захват, идентификаторы сессии не совпадают. Пользователь A вошел в оба сеанса, но идентификаторы сеанса совершенно разные. Это только один пример того, что может произойти. Я не могу воспроизвести проблему надежно, так как она кажется случайной.

Похоже, это не симптом среды или сервера, на котором он работает. Я могу воспроизвести проблему, используя как дворняжку, так и пассажира. Я также видел это в разработке и производстве. Я использую сеансы на основе БД в этом приложении, и оно работает на Rails 2.1.1. Я применил параметр Stateful при вызове генератора. В противном случае не было сделано никаких других изменений в способе обработки сеансов.

Обновление Вот неправильный метод, полученный непосредственно из restful_authentication.

# Accesses the current user from the session.
# Future calls avoid the database because nil is not equal to false.
def current_user
  @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false
end

Ответы [ 3 ]

3 голосов
/ 29 сентября 2008

Это может произойти, если вы (или те, кто написал restful_authentication) кэшируют текущего пользователя в переменной класса. Я видел множество статей, пропагандирующих использование "User.current_user", но поскольку классы кэшируются по запросам, это может привести к заражению сессии.

2 голосов
/ 09 октября 2008

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

0 голосов
/ 29 сентября 2008

Удален ли этот сайт? Вы входите в него на двух разных компьютерах в одной сети?

...