Ruby on rails Rails 3-通过路由的IP的白名单
这是一个由两部分组成的问题。我需要将我在开发服务器上投放的rails站点限制为只有几个IP地址,这样公众就无法访问它。(基本HTTP身份验证不能“完全”工作,因为身份验证破坏了项目中的Flash上传程序。) 根据我在谷歌上搜索的内容,这是我在我的路线文件中找到的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
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