Ruby on rails - 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, обновить, обновить пользователя и, таким образом, сеанс никогда не истекает.
любая идея? Спасибо
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
Authlogic может сделать это для вас. Просто используйте в своих моделях:
На модели пользователя:
acts_as_authentic do |c|
c.logged_in_timeout(5.minutes)
end
... и на модели UserSession:
self.logout_on_timeout = true
И просто работа! =D