ruby-on-rails - 如何让 Rack::Attack 在负载均衡器后面工作?

标签 ruby-on-rails rackattack

我使用了 Rack::Attack 的示例节流代码。

throttle('req/ip', limit: 100, period: 5.minutes) do |req|
  req.ip unless req.path.starts_with?('/assets')
end

这在我们的暂存服务器上运行良好,但立即遇到生产限制,因为 req.ip 返回我们的负载均衡器的 IP 地址,而不是客户端的 remote_ip。

请注意,remote_ip 是 ActionDispatch::Request 中的一个方法,但不是 Rack::Attack::Request 中的一个方法。

我们在 Ruby 2.2 上使用 Rails 3.2.2。

最佳答案

我可以通过向 Rack::Attack::Request 添加一个方法来让它工作

class Rack::Attack
  class Request < ::Rack::Request
    def remote_ip
      @remote_ip ||= (env['action_dispatch.remote_ip'] || ip).to_s
    end
  end
end

然后使用

req.remote_ip unless req.path.starts_with?('/assets')

关于ruby-on-rails - 如何让 Rack::Attack 在负载均衡器后面工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33533443/

相关文章:

ruby-on-rails - Rails是否可以优雅地处理缓存存储中断(memcached)?

ruby-on-rails - 正则表达式检测基本 SQL 注入(inject),但不能作为防止 SQL 注入(inject)的手段

ruby-on-rails-4 - rails 4 中的机架攻击和 Allow2Ban 过滤

ruby-on-rails - Redmine - 安装mysql2(0.3.16)时出错,Bundler无法继续

ruby-on-rails - Rails scaffold_controller生成器未将模型属性应用于 View

sql - Rails Model.find() 不返回信息(返回散列)

ruby-on-rails - Rails has_many 通过多个外键

ruby-on-rails - 如何对按日期时间排序的记录进行排序?