Tôi đang sử dụng rack-throttle
làm công cụ hạn chế tốc độ trong ứng dụng đường ray 3 của mình. Tôi đã tạo lớp của riêng mình dựa trên Rack::Throttle::Interval
để xác định logic giới hạn tốc độ tùy chỉnh. Tôi đang kiểm tra nếu yêu cầu được thực hiện cho bộ điều khiển chính xác và hành động chính xác. Điều này làm việc tốt nếu tôi thực hiện yêu cầu GET
. Tuy nhiên, nếu tôi gửi yêu cầu POST
tôi gặp một số vấn đề.Điều chỉnh yêu cầu POST trong ứng dụng đường ray
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
Dưới đây là những hành động điều khiển của tôi
def question
#user is redirected here
end
def check_answer
#some logic to check answer
redirect_to question_path
end
tuyến My
get "questions" => "application#question", :as => "question"
post "check_answer" => "application#check_answer", :as => "check_answer"
EDIT:
Vấn đề là POST
yêu cầu được đến ứng dụng vì vậy phương pháp mà allowed?
được gọi là . Nhưng khi tôi gọi Rails.application.routes.recognize_path
tôi nhận được ngoại lệ Route set not finalized
. Làm thế nào tôi có thể ngăn chặn một thành viên gửi rất nhiều bài yêu cầu về hành động chính xác của bộ điều khiển chính xác với sự giúp đỡ của rack-throttle
Các middleware được thêm vào trong 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
Cả IpLimiter
và IpUserAgentLimiter
có nguồn gốc từ tùy chỉnh giới hạn
Làm thế nào có bạn chèn rack của bạn :: Throttle :: Interval trong ứng dụng của bạn? – shingara
@shingara được bao gồm trong 'application.rb' – RomanKapitonov
Được phép? phương thức nào được gọi trong phương thức POST hay không? Bạn có thể pase phần mà bạn thêm middleware này trong ứng dụng của bạn? – shingara