Rails 3 + Devise: выход пользователя из системы после тайм-аута - PullRequest
3 голосов
/ 09 марта 2011

В моем приложении я установил для Devise тайм-аут сеанса через 30 минут. Что работает нормально ... пользователь должен войти снова после этого времени. Моя единственная проблема заключается в том, что devise, по-видимому, не использует действие уничтожения в контроллере сеанса после истечения времени ожидания сеанса. Таким образом, атрибут: Sign_in для пользователя не установлен на «ложь». Таким образом, даже после истечения времени ожидания сеанса этот пользователь все еще отображается как онлайн. Есть ли способ уничтожить сеанс после истечения времени ожидания или установить для атрибута Sign_in значение false через определенное время и при закрытии браузера?

Мое действие уничтожения в контроллере сеанса:

def destroy
  current_user.try("signed_in=", false); current_user.save
  signed_in = signed_in?(resource_name)
  sign_out_and_redirect(resource_name)
  set_flash_message :notice, :signed_out if signed_in
end

Ответы [ 2 ]

4 голосов
/ 13 марта 2011

Я не совсем эксперт по Devise, но подозреваю, что это из-за природы HTTP без сохранения состояния.Devise знает только, что время сеанса истекло, когда пользователь пытается снова получить доступ к странице после истечения времени ожидания, и, скорее всего, вызовет метод уничтожения только тогда, когда пользователь действительно выйдет из системы и вызовет метод уничтожения на контроллере сеанса.1002 * Чтобы достичь того, что вы, скорее всего, ищете, вам нужно запустить фоновый процесс, который сканирует старые сеансы, а затем вручную вызывает метод уничтожения (или выполняет что-то подобное).

1 голос
/ 20 октября 2012

С новой версией Devise он работает следующим образом, чтобы иметь точный статус онлайн / офлайн:

вставьте это в свой application_controller:

before_filter :last_request

def last_request
 if user_signed_in?
  if current_user.last_request_at < 1.minutes.ago
    current_user.update_attribute(:last_request_at, Time.now)
  end
  if current_user.currently_signed_in = false
      current_user.update_attribute(:currently_signed_in, true)
  end
 end
end

При каждом действии приложение проверяет,последний запрос был более 1 минуты назад, если да, он обновляет атрибут пользователя.

поместите это в user.rb:

before_save :set_last_request

Warden::Manager.after_authentication do |user,auth,opts|
  user.update_attribute(:currently_signed_in, true)
end

Warden::Manager.before_logout do |user,auth,opts|
  user.update_attribute(:currently_signed_in, false)
end

def set_last_request
  self.last_request_at = Time.now
end

def signed_in?
 if self.currently_signed_in

  if self.timedout?(self.last_request_at.localtime)
    return false
  else
    return true
  end

 else
  false
 end
end

, затем вы можете использовать подписанный_интерфейс?способ определения статуса пользователя в сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...