Подтвердить что ты не робот

Rails 3 - список белых списков IP-адресов через маршруты

Это вопрос из двух частей. Мне нужно ограничить сайт rails, что я бросаю на сервер разработки только несколько IP-адресов, поэтому публика не может получить к нему доступ. (Базовый HTTP-аутентификатор не работает полностью, поскольку auth прерывает загрузчик Flash в проекте.)

Основываясь на том, что я искал, это то, что я нашел в файле маршрутов...

class WhitelistConstraint
  def initialize
    @ips = '127.0.0.1'
  end

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

MyProject::Application.routes.draw do
  constraints WhitelistConstraint.new do
     # all my routing stuff here
  end
end

Работает очень хорошо. Однако мне нужно изменить это, чтобы работать с несколькими IP-адресами. Я попытался использовать массив на @ips, а также прокручивать каждый цикл, но не работал.

Кроме того, вторая часть моего вопроса... Возможно, мне придется проверять только сегмент IP, например "127.0.0". Как мне это сделать?

4b9b3361

Ответ 1

Я не знал, что вы можете сделать это через маршруты, мой подход состоял бы в том, чтобы просто before_filter в ApplicationController и просто иметь что-то, что делает:

before_filter :protect

def protect
  @ips = ['127.0.0.1', '203.123.10.1'] #And so on ...]
  if not @ips.include? request.remote_ip
     # Check for your subnet stuff here, for example
     # if not request.remote_ip.include?('127.0,0')
     render :text => "You are unauthorized"
     return
  end
end

Ответ 2

как насчет использования NetAddr:: CIDR?

и что-то вроде этого?

class WhitelistConstraint
  def initialize
    @ips = []
    @ips << NetAddr::CIDR.create('127.0.0.0/8')
    @ips << NetAddr::CIDR.create('192.168.0.0/16')
  end

  def matches?(request)
    valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
    !valid.empty?
   end
 end

 MyProject::Application.routes.draw do
    constraints WhitelistConstraint.new do
     # all my routing stuff here
     end
 end 

Таким образом вы можете указать блоки IP-адресов, которые должны быть белыми, и не нужно беспокоиться о частичных совпадениях?

>> require 'netaddr'
=> true
>> @ips = []
=> []
>> @ips << NetAddr::CIDR.create('127.0.0.0/8')
=> [127.0.0.08]
>> @ips << NetAddr::CIDR.create('192.168.0.0/16')
=> [127.0.0.08, 192.168.0.016]
>> @ips.select { |c| c.contains? '192.168.10.1' }
=> [192.168.0.016]
>> @ips.select { |c| c.contains? '192.169.10.1' }
=> []

Ответ 3

Или просто используйте apache.htaccess:

  • Добавьте следующее в http.conf или любой файл conf, который у вас есть для apache и вашего приложения rails.

AllowOverride all

  • Создайте файл .htaccess в папке rails и добавьте следующие
Allow from xxx.xxx.xxx.xxx
Deny from all

Ответ 4

Также можно окружать объявление маршрута областью видимости следующим образом:

scope :constraints => lambda{|req|%w(127.0.0.1).include? req.remote_addr} do

  ... your beautiful routes

end