Rails 3 - белый список IP-адресов по маршрутам - PullRequest
12 голосов
/ 05 апреля 2011

Это вопрос из двух частей. Мне нужно ограничить сайт рельсов, который я создаю на сервере разработки, только несколькими IP-адресами, чтобы публика не могла получить к нему доступ. (Базовая аутентификация HTTP не «полностью» работает, так как аутентификация нарушает загрузчик 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». Как бы я это сделал?

Ответы [ 4 ]

25 голосов
/ 05 апреля 2011

Я не знал, что вы могли бы сделать это через маршруты, мой подход был бы просто иметь 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
8 голосов
/ 05 апреля 2011

как насчет использования 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' }
=> []
1 голос
/ 04 октября 2012

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

1 голос
/ 05 апреля 2011

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

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

AllowOverride all

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