ruby-on-rails - 在 Rails 应用程序中限制 POST 请求

标签 ruby-on-rails ruby rack throttling rate-limiting

我在 Rails 3 应用程序中使用 rack-throttle 作为速率限制引擎。我已经基于 Rack::Throttle::Interval 创建了自己的类来定义自定义速率限制逻辑。我正在检查请求是否针对精确的 Controller 和精确的操作。如果我发出 GET 请求,这很好用。但是,如果我发送 POST 请求,我会遇到一些问题。

class CustomLimiter < Rack::Throttle::Interval
  def allowed?(request)
    path_info = Rails.application.routes.recognize_path request.url rescue path_info = {} 
    if path_info[:controller] == "some_controller" and path_info[:action] == "some_action"
      super
    else
      true
    end
  end
end

这是我的 Controller Action

def question
  #user is redirected here
end

def check_answer
  #some logic to check answer
  redirect_to question_path
end

我的路线

get "questions" => "application#question", :as => "question"
post "check_answer" => "application#check_answer", :as => "check_answer"

编辑:

问题是 POST 请求进入应用程序,因此调用方法 allowed?。但是当我调用 Rails.application.routes.recognize_path 时,我得到了一个 Route set not finalized 异常。我如何防止用户在 rack-throttle

的帮助下发送大量关于确切 Controller 的确切操作的 post 请求

中间件添加在application.rb

class Application < Rails::Application
  #Set up rate limiting
  config.require "ip_limiter"
  config.require "ip_user_agent_limiter"
  config.middleware.use IpLimiter, :min => 0.2
  config.middleware.use IpUserAgentLimiter, :min => 2
end

IpLimiterIpUserAgentLimiter 都派生自自定义限制器

最佳答案

阅读 Rails.application.routes.recognize_path ( http://apidock.com/rails/ActionDispatch/Routing/RouteSet/recognize_path ) 的代码后,此方法获得第二个参数,您可以在其中传递方法。

尝试:

path_info = Rails.application.routes.recognize_path(request.url, {:method => request.request_method}) rescue path_info = {} 

我想毕竟方法可行。

关于ruby-on-rails - 在 Rails 应用程序中限制 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662795/

相关文章:

ruby - Rails 5 升级:在 ActionDispatch::ParamsParser (RuntimeError) 之后没有要插入的中间件

mysql - 仅通过 resque-scheduler 调用 SQL 查询才会发生 ActiveRecord::StatementInvalid 错误

ruby-on-rails - Ruby on rails,强制用户下载 tmp 文件

ruby-on-rails - 如何获取 to_json 中回形针图像的 url

ruby - 按小时将事件列表压缩到容器中,包括 "blank"个容器(Ruby)

ruby-on-rails - 为什么 Rails 测试环境中的 rack env hash 为空?

ruby-on-rails - 当 Rails 应该在幕后运行时,它会大声发布它的语法吗?

ruby - 调用堆栈 "around"ruby​​代码

javascript - 你能在 Ruby 中使用 Case 语句进行无限计数吗?

ruby-on-rails - 在 Rack CORS 中实现正则表达式解决方案