2010-02-04 3 views
5

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

<%= 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

От AuthLogic source itself:

# 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 
+0

MERCI! это идеально – Mathieu

6

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

На модели пользователя:

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

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

self.logout_on_timeout = true 

И просто работать! = D

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