限制会话数量并发每个帐户用户设计,rails 4

时间:2014-12-18 17:41:23

标签: ruby-on-rails ruby session ruby-on-rails-4 devise

使用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天就完成了这项任务,但我无法得到它。

提前致谢!

1 个答案:

答案 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