仅为生产环境禁用设计注册

Posted

技术标签:

【中文标题】仅为生产环境禁用设计注册【英文标题】:disabling Devise registration for production environment only 【发布时间】:2011-07-19 05:10:44 【问题描述】:

我正在推出一个包含一组选定用户的测试版网站。我只想在生产环境中禁用注册,并且只在短时间内禁用(即我不想完全取消我的注册)。我知道我可以简单地隐藏“注册”链接,但我怀疑比我聪明的黑客仍然可以使用 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

它传递为“真”而不是假。有没有办法模拟生产环境?我只是在吐口水。

谢谢!

【问题讨论】:

我刚刚了解到RAILS_ENV 已被弃用,并且最好使用Rails.env 我使用的策略类似于if Rails.env.production? 将一些常量设置为true,然后在测试中,简单地测试常数。 是否可以在测试模式下运行 RSPEC 但让它假装它是生产的?喜欢设置 Rails.env? 您几乎可以在模型中添加 if Rails.env.production? or Rails.env.test? 并以这种方式解决它。 好的。我希望能够在部署之前进行测试......我很新:) 值得注意的是,删除 :registrable 会破坏创建 编辑注册的命名路由。这可能超出了预期的效果。 【参考方案1】:

编辑 user 模型并删除 :registerable,我认为这应该可以满足您的需求。

编辑:

我认为这可行:

if Rails.env.production?
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
else
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :registerable 
end

【讨论】:

这将删除所有环境,对吧?有没有办法在模型级别按环境指定? 不需要这个,但发现我可以在模型中使用“Rails.env”。无价 :) 谢谢。 根据 Chris Nicola 的回答 ***.com/a/8291318/9344,这将禁用编辑注册的功能,这可能超出预期的效果(在我的情况下肯定是这样)。 生产环境下如何禁用/users/sign_in?【参考方案2】:

由于其他人遇到了我遇到的问题(请参阅我的 cmets)。这正是我修复它的方法。我使用了墨菲斯劳的想法。但是您还需要确保 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

我添加了 Flash 消息,以告知任何偶然发现注册页面无法正常工作的人。

这是我的routes.rb中的内容

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

控制器哈希指定我希望它使用我覆盖的注册控制器。

无论如何,我希望这可以节省一些时间。

【讨论】:

否,因为它继承自 Devise:RegistrationsController,其中包含所有路由处理程序。我所做的就是覆盖创建路由。 接受的答案在生产中对我不起作用-确实如此-谢谢。 还有来自温哥华的你好 ;-) 不要以为我们见过面,但我们有共同的熟人。 非常感谢克里斯! :) 谢谢克里斯·尼古拉!【参考方案3】:

仅删除:registerable 不会解决问题。如果您的视图中有一些路线,您将收到错误消息:

undefined local variable or method 'edit_user_registration_path'

照顾好这个。

【讨论】:

可能还需要重启应用【参考方案4】:

您可以覆盖 Devise::RegistrationsController 和创建操作以重定向到您想要的页面。控制器应该看起来像这样:

class User::RegistrationsController < Devise::RegistrationsController

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

end

【讨论】:

这很重要,因为禁用 :registerable 会破坏编辑和创建注册路由。因此,如果您在生产环境中使用已创建的用户进行测试,那么禁用 :registrable 可能会导致一系列问题 没错。实际上,我不得不取消我的注册路线以进行生产。当我重建我的网站的一些核心功能时,我会尝试一下。谢谢! 请务必致电super,以防这不是生产。

以上是关于仅为生产环境禁用设计注册的主要内容,如果未能解决你的问题,请参考以下文章

我应该为生产环境禁用 BroswableAPIRenderer 吗?

在 Spring Boot 应用程序的生产环境中禁用 GraphiQL Playground

在禁用功能的情况下将代码运送到生产环境是不是存在风险?

如何在生产环境禁用swagger

本地主机和生产环境的 Azure Active Directory 应用程序注册

生产环境中的 Vue 故障