使用设计和会话存储设置动态会话超时

问题描述 投票:1回答:2

我知道我可以按照here所述的方式(每个用户)进行动态会话超时

这以前工作正常,但现在我正在使用Rails会话存储,并且不再工作。

我在Google上搜索了很长时间,但是没有找到答案,有人知道该怎么做吗?

谢谢

ruby-on-rails dynamic devise session-timeout session-store
2个回答
1
投票

我现在已经完成了一些before_filters:

class ApplicationController < ActionController::Base
  before_filter :update_session, :check_if_session_is_valid

  ...
  def check_if_session_is_valid
    session_timeout = current_user.try(:session_timeout) || 1800
    if session[:timestamp] <= session_timeout.seconds.ago.to_i
      session[:user_id] = nil
    end
  end

  def update_session
    session[:timestamp] = Time.now.to_i
  end

并且在由轮询器使用的控制器中,我添加了此内容(会话不应由轮询器更新):

skip_before_filter :update_session, :only => :get_new

1
投票

使用devise进行会话超时的最简单方法是使用Devise'timeoutable'模块。以下两行将提供会话超时功能,仅当您在Rails应用程序中使用devise时。

步骤1:在User.rb模型中声明此内容

 devise: timeoutable

步骤2:

app / config / initializers / devise.rb中添加以下行,Devise的默认设置为30分钟。

config.timeout_in = 15.minutes

希望这对您有用!

谢谢!


0
投票

答案strait out of the wiki is:要为每个用户动态设置超时,您可以在用户模型中定义一个称为timeout_in的方法,该方法返回超时值。

class User < ActiveRecord::Base
  devise (...), :timeoutable

  def timeout_in
   return 1.year if admin?
   1.days
  end
end

timeout_in应该返回一个以秒为单位的整数(设计使用的timedout?方法使用timeout_in返回的值调用ago方法)。当然,您可以使用Rails 10秒或1.小时来提高可读性。

© www.soinside.com 2019 - 2024. All rights reserved.