Как удалить предыдущие сеансы в Rails, если пользователь забыл выйти из системы и закрыть браузер?

Я храню всю информацию о сеансе в базе данных. Пользователь может войти в систему, чтобы что-то сделать. Есть некоторые зоны ограниченного доступа, требующие входа пользователя. Если пользователь попытается достичь этой области до входа в систему, система перенаправит его на страницу входа.

Иногда пользователь может закрыть браузер без выхода из системы. Если это произойдет, в следующий раз, когда он попытается войти в систему, система не сможет распознать вновь созданный сеанс, даже если пользователь ввел правильное имя пользователя и пароль. Затем система снова принудительно выполнит вход пользователя.

Кто-нибудь знает, как это исправить? Я попытался сбросить сеанс с помощью reset_session перед загрузкой страницы входа. Проблема не может быть решена.

Контроллер сеанса

  def new
  end

  def create
    session[:current_account] = Account.authenticate(params[:email], params[:password])
    if session[:current_account]
      redirect_to :controller => "xxxxx", :action => "index"
    else
      flash[:notice] = "Please try again."
      render :action => 'new'
    end
  end

Модель учетной записи

  def self.authenticate(email, pass)
    account = find_by_email(email)
    account && account.authenticated?(pass) ? account : nil
  end

  def authenticated?(pass)
    encrypted_password == Account.encrypt(pass,salt)
  end

Контроллер Xxxxx

  before_filter :permission_handling

  def index
  end

Контроллер приложений

  def permission_handling
    unless logged_in?
      forced_login
    end
  end

  def logged_in?
    session[:current_account].is_a?(Account)
  end

  def forced_login
    flash[:notice] = "You haven't login yet!"
    redirect_to ( :controller => "sessions", :action => "new" )
  end

Спасибо всем. :)


person Victor Lam    schedule 23.06.2010    source источник


Ответы (1)


Похоже, вы сохраняете объект Account в сеансе. Это не рекомендуется: вы должны хранить только простые значения, такие как идентификатор учетной записи в сеансе.

Измените Model.authenticate, чтобы вернуть account.id, и проверьте logged_in, загрузив учетную запись из базы данных вместо сохранения ее в сеансе.

Я не уверен, что это полностью решает проблему, но это может быть значительным.

person Andrew Vit    schedule 23.06.2010
comment
Спасибо дружище. Я попробую. :) - person Victor Lam; 23.06.2010