2011-03-09 3 views
3

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

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

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 

ответ

1

С новой версией 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 

вы можете использовать signed_in? метод для определения статуса онлайн-пользователей.

4

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

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

Смежные вопросы