Ruby на направляющих - Authlogic: периодически проверяйте, допустим ли сеанс пользователя

Я ищу решение, разрешающее мне периодически проверять, если сеанс пользователя истек и раз так перенаправляет его к странице входа в систему.
Я использую драгоценный камень Authlogic, поэтому что я делаю, вызывают функцию, которые делают тест на current_user.
Мой USER_SESSION_TIMEOUT составляет 5 минут, таким образом, я выполняю этот ajax вызов каждый 5:10 минут.

<%= periodically_call_remote :url => {:controller => 'user_session', :action => 'check_session_timed_out'}, :frequency =>  (USER_SESSION_TIMEOUT + 10.seconds) %>

def check_session_timed_out
   if !current_user
      flash[:login_notice] = "Your session timed out due to a period of inactivity. Please sign in again."
      render :update do |page|
          page.redirect_to "/user_sessions/new"   
      end
   else
       render :nothing => true
   end
end

Я заметил, что каждый раз называю current_user, пользовательский объект обновляется и таким образом, сессия возобновляется к 5 минутам.
Нет никакой проблемы, когда только одна вкладка открыта, но если у меня есть 2 вкладки каждый раз, когда я звоню, check_session_timed_out current_user возобновляют, обновляют пользователя и таким образом, сессия никогда не истекает.

какая-либо идея?Спасибо

5
задан Mathieu 4 February 2010 в 22:38
поделиться

2 ответа

Из самого источника AuthLogic :

# For example, what if you had a javascript function that polled the server
# updating how much time is left in their session before it times out. Obviously
# you would want to ignore this request, because then the user would never
# time out. So you can do something like this in your controller:

def last_request_update_allowed?
 action_name != "update_session_time_left"
end

В вашем случае вы хотите добавить метод в свой контроллер, используя имя вашего действия:

def last_request_update_allowed?
  action_name != "check_session_timed_out"
end
5
ответ дан 13 December 2019 в 19:27
поделиться

Authlogic может сделать это за вас. Просто используйте в своих моделях:

В модели User:

acts_as_authentic do |c|
  c.logged_in_timeout(5.minutes)
end

... и в модели UserSession:

self.logout_on_timeout = true

И просто работайте! = D

6
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: