Ruby on rails Rails 3-通过路由的IP的白名单

Ruby on rails Rails 3-通过路由的IP的白名单,ruby-on-rails,routing,constraints,ip,Ruby On Rails,Routing,Constraints,Ip,这是一个由两部分组成的问题。我需要将我在开发服务器上投放的rails站点限制为只有几个IP地址,这样公众就无法访问它。(基本HTTP身份验证不能“完全”工作,因为身份验证破坏了项目中的Flash上传程序。) 根据我在谷歌上搜索的内容,这是我在我的路线文件中找到的 class WhitelistConstraint def initialize @ips = '127.0.0.1' end def matches?(request) @ips.include?(req

这是一个由两部分组成的问题。我需要将我在开发服务器上投放的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上使用一个数组,并在each循环中循环,但都不起作用


除此之外,我问题的第二部分……我可能只需要对照IP的一部分进行检查,如“127.0.0”。我该怎么做呢?

我不知道你可以通过路由来实现这一点,我的方法是在
应用程序控制器中的
过滤器之前设置一个
,然后设置一些功能:

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
那使用什么呢

像这样的

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 
类WhitelistConstraint
def初始化
@ips=[]
@IP需要“NetAddress”
=>正确
>>@ips=[]
=> []
>>@ips[127.0.0.08]
>>@ips[127.0.0.08192.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:

  • 将以下内容添加到http.conf或apache和rails应用程序的任何conf文件中
  • 允许超越所有

  • 在rails文件夹中创建一个.htaccess文件,并添加以下内容

  • 也可以在路由声明的周围使用如下范围:

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

    我第一次尝试了这个,但没有成功,当时正在研究rails.htaccess,有人建议改用routes,这就是导致我出现上述问题的原因。但是,既然您提到了它,我可能还没有在我的http.conf中获得所有的AllowOverride。我还没有时间尝试一下,因为我使用了另一个解决方案,但是在项目中会有一个点,我需要.htaccess文件,所以这会派上用场的。我最终通过编辑乘客的vhost文件并在其中添加AllowOverride并添加上面的.htaccess来获得.htaccess。对我来说不起作用,出现“uninitialized constant WhitelistConstraint::NetAddress”错误。如果使用rails 3,则需要将NetAddress Gem添加到Gemfile中,并执行捆绑舞蹈:),如果使用rails 2,则需要更新Gem配置。啊,好的,这很有意义。找到了上面的替代解决方案,可能更好,因为这只是内部测试的“临时”问题,但如果我需要更复杂的东西,我会记住上面的内容。感谢Doon,gem正是我在Rails中寻找的处理子网掩码的方法。我不知道你也可以。然而,这个解决方案对我来说马上就起作用了,而且可能是更好的选择。从开发到生产(暂时是临时服务器)可能会遇到问题,但这只是暂时的,我可以根据需要在两个环境中添加IP。谢谢。您可以使用
    Rails.env.production?
    Rails.env.development?
    以某种
    if
    构造来检查环境,以满足您的需要。祝你好运:)我想你可以将这个解决方案与我的IP地址结合使用,在评论中应该是“127.0.0”,而不是“127.0,0”
    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