Rails:可以根据IP地址(或范围?)来限制路由

Mel*_*emi 1 routing routes ruby-on-rails sidekiq

我知道这通常发生在控制器中,但我想知道是否有可能config/routes.rb限制基于特定IP(或IP范围)的路由?某种白名单,某种形式。

例如,我想将此路由限制为仅子网中的IP:

#config/routes.rb
require 'sidekiq/web'

MyApp::Application.routes.draw do
  resources :users
  ...
  mount Sidekiq::Web, at: "/sidekiq"      # <== restrict this based on IP address
  ...
end
Run Code Online (Sandbox Code Playgroud)

cla*_*234 5

根据Rails Docs中的示例,您可以执行以下操作:

#config/routes.rb
require 'sidekiq/web'

MyApp::Application.routes.draw do
  resources :users
  ...
  mount Sidekiq::Web, at: "/sidekiq", :constraint => Whitelist.new
  ...
end

class Whitelist
  def initialize
    @ips = Whitelist.retrieve_ips
  end

  def matches?(request)
    @ips.include?(request.remote_ip)
  end

  def retrieve_ips
    # get and return your whitelist of ips
  end
end
Run Code Online (Sandbox Code Playgroud)

Yehuda Katz的这篇文章更详细地介绍了约束及其使用方法。

  • `@ips = Whitelist.retrieve_ips` 所以 `retrieve_ips` 是一个类方法,所以 `defretrieve_ips` 应该是 `def self.retrieve_ips` (2认同)