2011-01-27 4 views
1

Есть ли способ загрузить приложение, но только он доступен мне? Или, может быть, с помощью определенного набора IP-адресов?Как ограничить доступ общественности к приложению rails

Причина в том, что мы хотим запустить несколько частных онлайн-тестов, прежде чем открывать приложение для широкой публики. До сих пор я придумал следующий код:

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 

Однако приведенный выше код еще делает основной файл макета (приложение/просмотров/макеты/application.html.erb), которое обнажает логотип и нижний колонтитулы. Для несанкционированного доступа мы хотим отобразить страницу, которая говорит что-то вроде «Ooops, мы все еще делаем несколько тестов и скоро будем опубликованы». Нет логотипа сайта, ничего. Просто простое сообщение.

Мы используем устройство как наш подлинный камень. Мы не хотим добавлять функции аутентификации только для ограничения доступа для частного бета-тестирования. Мы хотим сделать это по IP вместо этого.

Возможно ли такое? Возможно, код, над которым нужно просто работать? Или есть драгоценный камень, который мы можем использовать исключительно для этого требования?

ответ

1

Если вы развертываете Apache или Nginx, это должно быть достаточно простым для настройки в соответствующих конфигурационных файлах сайта. В этом случае не обязательно находиться в самом приложении.

Я не совсем уверен, в чем проблема с вашим существующим кодом. Вы говорите, что фильтр, кажется, игнорируется или что файл отображается в макете? Если это последний, указание :layout => false в качестве опции рендеринга должно позаботиться об этом.

+0

Мой вебхостинг является Heroku. Не слишком уверен, что у меня есть доступ к файлам конфигурации сервера. Однако: layout => false сделал это. Спасибо за это! –

+0

Также следует отобразить шаблон 503 вместо 500? –

+0

@Christian: так как это всего лишь временная мера, я не думаю, что вам нужно беспокоиться о том, какой именно код ошибки использовать. Однако, поскольку вы отправляете код ошибки 401 (': unauthorized'), возможно, будет указано имя файла' 401.html'. – Matchu

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 

НЕ ПРОВЕРЕНО

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

Смежные вопросы