使用Rails 4.0和ruby 2.1.0
我正在开发一个基于订阅的项目,并且帐户需要限制每个用户的并发会话。例如,普通用户每个帐户1个并发会话,中等用户 - 每个帐户3个并发会话,每个帐户高级用户10个并发会话。
我已经检查过每一页google,stackoverflow,不同的宝石,例如devise:timeoutable或devise_session_limit gem。我尝试过一个名为connections的字段,取决于用户是1,3或10。如果用户登录,则递减-1连接字段,如果用户注销,则递增+1连接字段。问题是当用户继续打开会话并离开时,永远不会增加+1。
有什么建议吗?我差不多3天就完成了这项任务,但我无法得到它。
提前致谢!
答案 0 :(得分:0)
您可以挂钩设计,只要您拥有:timeoutable模块,您就可以检查用户是否已超时并运行您喜欢的任何代码。请参阅此警告挂钩以供参考:https://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb
该代码的重要部分是检查record.timedout?
。如果这是真的,请运行您的连接增量代码。
具体来说,用这个写一个config/initializers/connections_updater.rb
文件(类似于上面的链接代码,它是一个监狱长挂钩):
Warden::Manager.after_set_user do |record, warden, options|
scope = options[:scope]
env = warden.request.env
if record && record.respond_to?(:timedout?) && warden.authenticated?(scope) && options[:store] != false
last_request_at = warden.session(scope)['last_request_at']
if last_request_at.is_a? Integer
last_request_at = Time.at(last_request_at).utc
elsif last_request_at.is_a? String
last_request_at = Time.parse(last_request_at)
end
proxy = Devise::Hooks::Proxy.new(warden)
if record.timedout?(last_request_at) && !env['devise.skip_timeout']
# write this method to do what you need when the session times out
record.increment_connections_count! # Note: record is the user model
Devise.sign_out_all_scopes ? proxy.sign_out : proxy.sign_out(scope)
end
end
end