Pergunta

Eu estou procurando uma solução que me permite verificar periodicamente se a sessão de usuário expirou e se assim redirecioná-lo para a página de login.
Estou usando Authlogic gem, então o que estou fazendo é chamar uma função que fazer um teste em current_user.
Meu USER_SESSION_TIMEOUT é cinco minutos assim que eu faço esta ajax chamar a cada 5:10 minutos.

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

notei que cada vez que eu chamada current_user o objeto de usuário é atualizado e assim a sessão é renovada a 5 minutos.
Não há nenhum problema quando apenas uma aba é aberta, mas se eu tiver 2 guias cada vez que eu chamo current_user check_session_timed_out renovar atualizar o usuário e assim a sessão nunca expira.

alguma idéia? Graças

Foi útil?

Solução

A partir do AuthLogic si :

# 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

No seu caso, você gostaria de adicionar o método para o seu controlador usando o nome de sua ação:

def last_request_update_allowed?
  action_name != "check_session_timed_out"
end

Outras dicas

Authlogic pode fazer isso por você. Basta usar em seus modelos:

No modelo de usuário:

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

... e no modelo UserSession:

self.logout_on_timeout = true

E simplesmente trabalho! = D

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top