我知道我可以按照here所述的方式(每个用户)进行动态会话超时
这以前工作正常,但现在我正在使用Rails会话存储,并且不再工作。
我在Google上搜索了很长时间,但是没有找到答案,有人知道该怎么做吗?
谢谢
我现在已经完成了一些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
使用devise进行会话超时的最简单方法是使用Devise'timeoutable'模块。以下两行将提供会话超时功能,仅当您在Rails应用程序中使用devise时。
步骤1:在User.rb模型中声明此内容
devise: timeoutable
步骤2:
在app / config / initializers / devise.rb中添加以下行,Devise的默认设置为30分钟。
config.timeout_in = 15.minutes
希望这对您有用!
谢谢!
答案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.小时来提高可读性。