Сессия не уничтожается при закрытии браузера - RailsTutorial.org

Работая с railstutorial.org Майкла Хартла, я нахожусь в главе 8 (в частности, в 8.2.3). Текущая проблема заключается в реализации сеанса, чтобы пользователь оставался в системе в нескольких представлениях, но функциональность, реализованная в этом разделе, должна быть временным сеансом, срок действия которого истекает (выводит пользователя из системы), когда окно браузера закрыто. Вот утверждение из учебника, указывающее на такое:

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

Я протестировал эту функцию как в Google Chrome, так и в Firefox — я успешно вхожу в систему, перехожу к нескольким страницам (чтобы убедиться, что мой сеанс сохраняется после перенаправления log_in), а затем закрываю браузер — но когда я перезагружаю веб-приложение, Я все еще вошел в систему. Я скопировал весь код в точности, как он написан в тексте, но безрезультатно. Для справки, вот мой файл sessions_helper.rb:

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

end

А вот и мой файл sessions_controller.rb (действие destroy еще не реализовано, так как я не дошел в тексте до того, чтобы придать кнопке Logout какую-либо функциональность):

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # Log the user in and redirect to the user's show page.
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination' 
      render 'new'
    end
  end

  def destroy
  end

конец

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


person M. Layton    schedule 17.09.2015    source источник


Ответы (2)


Пожалуйста, проверьте файл config/initializers/session_store.rb. Должно быть что-то вроде

Rails.application.config.session_store :cookie_store, key: '_app_session'

Вы должны добавить ключ expire_after со значением nil в опции:

Rails.application.config.session_store :cookie_store, key: '_app_session', expire_after: nil

После применения этого изменения сеанс истечет, когда пользователь закроет браузер. Вы можете узнать больше об истечении срока действия файлов cookie здесь

person intale    schedule 17.09.2015
comment
Я попробовал ваше предложение и добавил expire_after: nil в свой файл session_store.rb, и он по-прежнему сохраняет вход в систему после закрытия браузера и загрузки сайта в новом сеансе браузера. Я даже пытался вручную остановить сервер, перезапустить его и перезагрузить страницу, но мой пользователь все еще вошел в систему. Я не знаю, имеет ли это значение или нет, но я использую c9.io для размещения этого проекта и обслуживания страницу через встроенный сервер WEBrick. Однако я загружаю страницы сайта в новую вкладку браузера, а не в веб-приложение c9.io. Будет ли это вообще иметь значение? - person M. Layton; 18.09.2015
comment
FWIW, я пробовал это в Chrome, Firefox и IE. Как в Chrome, так и в Firefox сеанс сохраняется после перезапуска браузера. В IE срок действия сеанса истек, и мне нужно повторно войти в систему, когда открывается новое окно браузера (что является правильным поведением). - person M. Layton; 18.09.2015
comment
Делать это нужно так: применить изменения (expire_after: nil), перезапустить сервер, выйти из системы. После следующего входа сеанс должен истечь после закрытия браузера. Требуемое поведение можно просто проверить - куки с именем, указанным в config/initializers/session_store.rb (в моем примере это '_app_session'), не должны иметь срока действия. - person intale; 18.09.2015
comment
Насчет c9.io - я вообще не в курсе его поведения. А почему бы тебе не использовать свой собственный компьютер? - person intale; 18.09.2015
comment
Значит, нет эффективного решения этой проблемы, кроме, конечно, установки срока действия? - person himanish.k; 29.04.2017

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

Проблема заключается в настройках браузера, которые, как мне кажется, в наши дни используют почти все: «При запуске Firefox показывать мои окна и вкладки с прошлого раза» или «При запуске продолжать с того места, на котором остановились». Эта проблема теперь упоминается в руководстве в виде сноски (глава 8, примечание 1), но лучшее, что может сказать об этом автор, это

...конечно, Rails не контролирует это поведение.

person Ryan Lue    schedule 04.04.2016