отключение регистрации Devise только для производственной среды

Я запускаю бета-сайт для избранной группы пользователей. Я хочу отключить регистрацию только в производственной среде и только на короткий период времени (т. Е. Я не хочу полностью уничтожать свою регистрацию). Я знаю, что могу просто скрыть ссылку «зарегистрироваться», но подозреваю, что хакеры более умные, чем я, все еще могут использовать маршруты RESTful для выполнения регистраций. Как лучше всего отключить регистрацию, чтобы мои среды тестирования / разработки по-прежнему работали, но это повлияло на производство? Спасибо за любые указатели.

Я пробовал указывать именованные области таким образом, чтобы «sign_up» переходило в «sign_in», но это не сработало. Вот что я пробовал:

devise_scope :user do
    get "users/sign_in", :to => "devise/sessions#new", :as => :sign_in
    get "users/sign_up", :to => "devise/sessions#new", :as => :sign_up
end

В идеале мы отправили бы пользователя на страницу «pages # registration_disabled» или что-то в этом роде. Я просто хотел получить что-то работающее, с чем можно было бы поиграть.

РЕДАКТИРОВАТЬ: я изменил модель по запросу, а затем добавил следующее в /spec/user_spec.rb

describe "validations" do
    it "should fail registration if in production mode" do
      ENV['RAILS_ENV'] = "production"
      @user = Factory(:user).should_not be_valid
    end
end

он передается как «истинный», а не ложный. Есть ли способ смоделировать производственную среду? Я просто наплевал на это.

Спасибо!


person panzhuli    schedule 20.03.2011    source источник
comment
Я только что узнал, что RAILS_ENV устарел и что предпочтительнее использовать Rails.env Стратегия, которую я использую, - это что-то вроде if Rails.env.production? установить некоторую константу в значение true, а затем в тесте просто проверить константу.   -  person Fareesh Vijayarangam    schedule 20.03.2011
comment
Можно ли запустить RSPEC в тестовом режиме, но сделать вид, что он является производственным? как установить Rails.env?   -  person panzhuli    schedule 20.03.2011
comment
Вы могли бы просто добавить if Rails.env.production? or Rails.env.test? в модель и решить ее таким образом.   -  person Fareesh Vijayarangam    schedule 20.03.2011
comment
в порядке. я надеялся, что смогу протестировать перед развертыванием ... я новенький :)   -  person panzhuli    schedule 20.03.2011
comment
Да, сначала нужно пройти тест.   -  person Fareesh Vijayarangam    schedule 20.03.2011
comment
Стоит отметить, что удаление: registrable прерывает именованные маршруты как для создания , так и для редактирования регистраций. Вероятно, это больше, чем желаемый эффект.   -  person Chris Nicola    schedule 28.11.2011


Ответы (4)


Поскольку у других есть проблема, с которой я столкнулся (см. Мои комментарии). Вот как я это исправил. Я воспользовался идеей Мерфислава. Но вам также необходимо убедиться, что devise использует ваш новый контроллер для маршрутизации регистрации, иначе это не принесет вам много пользы.

Вот мое переопределение контроллера:

class RegistrationsController < Devise::RegistrationsController
  def new
    flash[:info] = 'Registrations are not open yet, but please check back soon'
    redirect_to root_path
  end

  def create
    flash[:info] = 'Registrations are not open yet, but please check back soon'
    redirect_to root_path
  end
end

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

Вот что есть у меня routes.rb

  if Rails.env.production?
    devise_for :users, :controllers => { :registrations => "registrations" } 
  else
    devise_for :users
  end

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

В любом случае, я надеюсь, что это кому-то сэкономит время.

person Chris Nicola    schedule 28.11.2011
comment
Нет, потому что он наследуется от Devise:RegistrationsController, который содержит все обработчики маршрутов. Все, что я сделал, это переопределил маршрут создания. - person Chris Nicola; 02.12.2011
comment
Принятый ответ не сработал для меня в продакшене - это работает - спасибо. - person RidingTheRails; 29.03.2012
comment
И привет из Ванкувера ;-) Думаю, мы не встречались, но у нас есть общие знакомые. - person Ted; 07.11.2012
comment
Большое спасибо, Крис! :) - person Katie H; 25.02.2014
comment
Хороший ответ! Я сам этим пользуюсь. Одно замечание: начиная с версии v2.2.1 вы можете использовать Rails.env.production? вместо Rails.env == 'production'. - person Ben; 03.03.2014
comment
Да, я обычно так делаю в наши дни. Обновил ответ, так как он выглядит лучше. - person Chris Nicola; 09.03.2014
comment
Спасибо Крису Никола! - person rld; 02.11.2015

Отредактируйте модель user и удалите :registerable, я думаю, это должно дать вам то, что вы хотите.

Изменить:

Думаю, это сработает:

if Rails.env.production?
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
else
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :registerable 
end
person Fareesh Vijayarangam    schedule 20.03.2011
comment
Это могло бы удалить для всех сред, правда? есть ли способ указать среду на уровне модели? - person panzhuli; 20.03.2011
comment
Мне это не понадобилось, но я обнаружил, что могу использовать Rails.env в моделях. Бесценно :) Спасибо. - person vvohra87; 30.11.2011
comment
Согласно ответу Криса Никола stackoverflow.com/a/8291318/9344, это отключит возможность редактирования регистраций, что, вероятно, более чем желаемый эффект (в моем случае однозначно был). - person Ted; 07.11.2012
comment
Как отключить / users / sign_in в процессе производства? - person W.M.; 13.09.2017

Только удаление :registerable проблемы не решит. Если в вашем представлении есть маршруты, вы получите сообщение об ошибке:

undefined local variable or method 'edit_user_registration_path'

Позаботьтесь об этом.

person Mindbreaker    schedule 02.01.2013
comment
также может потребоваться перезапуск приложения - person Will; 23.08.2013

вы можете переопределить Devise :: RegistrationsController и действие create для перенаправления на нужную страницу. Контроллер, вероятно, должен выглядеть примерно так:

class User::RegistrationsController < Devise::RegistrationsController

  def create
    redirect_to your_page_path if Rails.env.production?
  end

end
person murphyslaw    schedule 17.07.2011
comment
Это важно, поскольку отключение: регистрируемых разрывов позволяет редактировать и создавать маршруты регистрации. Итак, если вы тестируете в производственной среде с пользователями, которых вы уже создали, отключение: registrable может вызвать кучу проблем. - person Chris Nicola; 28.11.2011
comment
Точно. Мне действительно пришлось убить мой регистрационный маршрут для производства. Я попробую это сделать, перестроив некоторые основные функции своего сайта. Спасибо! - person panzhuli; 28.11.2011
comment
Обязательно позвоните super, если это не производство. - person Sunny; 20.03.2021