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". Как мне это сделать?
Ответы
Ответ 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