【问题标题】:Limit sessions number concurrent per account user devise, rails 4限制每个帐户用户设计的并发会话数,rails 4
【发布时间】:2015-02-17 14:15:00
【问题描述】:

使用 Rails 4.0 和 ruby​​ 2.1.0

我正在开展一个基于订阅的项目,并且帐户需要限制每个用户的并发会话数。例如,普通用户每个帐户 1 个并发会话,中级用户 - 每个帐户 3 个并发会话,高级用户每个帐户 10 个并发会话。

我检查了 google、stackoverflow、devise:timeoutable 或 devise_session_limit gem 等不同 gem 的每一页。我尝试了一个名为connections的字段,根据用户的不同,它是1、3或10。如果用户登录,则减少 -1 连接字段,如果用户注销,则增加 +1 连接字段。事情或问题是当用户保持打开会话并离开时,永远不会增加 +1。

有什么建议吗??我在这个任务上工作了将近 3 天,但我无法完成。

提前致谢!

【问题讨论】:

  • 您尝试增加/减少连接的解决方案听起来不错,但它需要与可超时的 gem 一起使用,以便保持打开的会话可以自动超时并增加连接。
  • 是的,我试过这样做,但我找不到将它放在一起的解决方案。问题是我如何控制超时关闭会话。我以这种方式搜索了类似回调的东西:在超时关闭会话之前,但我找不到任何东西。谢谢迭戈!
  • 我正在寻找这个 link ,但我没有为我工作。我不知道如何重写这个模块,是吗?
  • 我有同样的问题,我尝试将 session_limit 和 session_count 添加到用户表。当用户注销并发生超时注销时,它工作正常。当用户在未注销的情况下关闭浏览器时,session_count 仍然存在,我收到名为 session limit 的消息

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


【解决方案1】:

您可以连接到设计中,只要您有 :timeoutable 模块,您就可以检查用户是否已超时并运行您喜欢的任何代码。请参阅此守望者挂钩以供参考:https://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb

该代码的重要部分是检查record.timedout?。如果这是真的,请运行您的连接增量代码。

具体来说,用这个写一个config/initializers/connections_updater.rb 文件(类似于上面的链接代码,它是一个warden hook):

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

【讨论】:

  • 看起来不错!!我按照你的方式试过了,但我得到了这个错误:NameError in DeviseInvitable::SessionsController#createuninitialized constant Devise::Hooks我试图解决自己,但我不能。我错过了什么??再次感谢迭戈!
猜你喜欢
  • 2011-06-24
  • 2014-04-02
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
相关资源
最近更新 更多