Rails 3 -通过路由的ip白名单



这个问题分为两部分。我需要将我在开发服务器上放置的rails站点限制为只有几个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'。我该怎么做呢?

我不知道你可以通过路由来做到这一点,我的方法是在ApplicationController中加入一个before_filter,然后做一些事情:

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.1')
     render :text => "You are unauthorized"
     return
  end
end
   

使用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' }
=> []

或者直接使用apache的。htaccess:

  1. 将以下内容添加到apache和rails应用的http.conf或其他配置文件中

AllowOverride所有的

  1. 在rails文件夹中创建一个.htaccess文件,并添加以下
Allow from xxx.xxx.xxx.xxx
Deny from all

也可以像这样用作用域包围你的路由声明:

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

相关内容

  • 没有找到相关文章

最新更新