如何限制对rails应用程序的公共访问

时间:2011-01-27 17:36:42

标签: ruby-on-rails

有没有办法上传应用,但只有我可以访问它?或者也许是通过一组特定的IP?

原因是,我们希望在向公众开放应用之前运行一些私人在线测试。到目前为止,我已经提出了以下代码:

class ApplicationController < ActionController::Base
  before_filter :restrict_access

  def restrict_access
    whitelist = ['127.0.0.123', '10.0.1.7', '10.0.1.8'].freeze

    unless( whitelist.include? request.env['REMOTE_ADDR'] )
      render :file => "#{Rails.public_path}/500.html", :status => :unauthorized
      return
    end
  end
end

但是,上面的代码仍然呈现主要布局文件(app / views / layouts / application.html.erb),它暴露了徽标和页脚。对于未经授权的访问,我们希望显示一个页面,上面写着“Ooops,我们仍在进行一些测试,很快就会公开!”。没有网站的标志,没有任何东西。只是一条简单的信息。

我们使用devise作为我们的身份验证gem。我们不想仅仅为了限制私有beta测试的访问而添加身份验证功能。我们希望通过IP来实现。

这样的事情可能吗?也许上面的代码只需要工作?或者是否有一颗我们只能用于此要求的宝石?

3 个答案:

答案 0 :(得分:1)

如果您在Apache或Nginx上进行部署,这应该很容易在相关的站点配置文件中进行配置。在这种情况下,不需要在应用程序本身。

我不完全确定您现有代码的问题。您是说过滤器似乎被忽略,或者文件在布局中呈现?如果是后者,则将:layout => false指定为渲染选项应该注意这一点。

答案 1 :(得分:0)

我建议使用一些Rack中间件a.e. rack-rewrite

require 'rack-rewrite'

 #in your environment
  config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
      r301 %r{.*}, "YOUR REDIRECTPAGE$&" ,:if => Proc.new {|rack_env|
              #puts here your conditions basing on rack_env
      }
  end

未经测试

答案 2 :(得分:0)

class ApplicationController < ActionController::Base
before_filter :check, :except=>:unauth

def unauth
  render(:layout=>false)
end

private
  def check
    whitelist = ['127.0.0.123', '10.0.1.7', '10.0.1.8'].freeze
    if !(whitelist.include? request.env['REMOTE_ADDR'])
      redirect_to('/unauth')
      return
    end
  end
end

未经测试但应该这样做,现在你可以在unauth.rhtml中放置一个简单的错误消息或其他什么