web-dev-qa-db-fra.com

désactivation de l'enregistrement Devise pour l'environnement de production uniquement

Je lance un site bêta avec un groupe restreint d'utilisateurs. Je souhaite désactiver l'enregistrement dans l'environnement de production uniquement, et uniquement pour une courte période (c'est-à-dire que je ne veux pas nuquer complètement mon enregistrement). Je sais que je peux simplement masquer le lien "inscription", mais je soupçonne que les pirates informatiques sont plus intelligents que je peux encore utiliser les routes RESTful pour effectuer les enregistrements. Quelle est la meilleure façon de désactiver l'enregistrement pour que mes environnements de test/développement fonctionnent toujours, mais la production est affectée? Merci pour tous les conseils.

J'ai essayé de pointer des étendues nommées de telle manière que "sign_up" passe à "sign_in", mais cela n'a pas fonctionné. Voici ce que j'ai essayé:

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

Idéalement, nous enverrions l'utilisateur à une page "pages # registration_disabled" ou quelque chose comme ça. Je voulais juste faire fonctionner quelque chose avec lequel je peux jouer.

EDIT: J'ai changé le modèle comme demandé, puis ajouté ce qui suit à /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

cela passe comme "vrai" plutôt que faux. Existe-t-il un moyen de simuler l'environnement de production? Je suis juste en train de cracher celui-ci.

Merci!

69
panzhuli

Puisque d'autres ont le problème que j'ai (voir mes commentaires). Voici exactement comment je l'ai corrigé. J'ai utilisé l'idée de murphyslaw. Mais vous devez également vous assurer que devise utilise votre nouveau contrôleur pour le routage d'enregistrement, sinon il ne fera pas grand-chose pour vous.

Voici ma priorité de contrôleur:

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

J'ai ajouté des messages flash pour informer toute personne qui tombe d'une manière ou d'une autre sur la page d'inscription pourquoi cela ne fonctionne pas.

Voici ce qui est dans mon routes.rb

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

Le hachage des contrôleurs spécifie que je veux qu'il utilise mon contrôleur d'enregistrements substitué.

Quoi qu'il en soit, j'espère que cela fera gagner du temps à quelqu'un.

88
Chris Nicola

Modifiez le modèle user et supprimez :registerable, Je pense que cela devrait vous donner ce que vous voulez.

Modifier:

Je pense que cela fonctionnerait:

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

Supprimer uniquement :registerable ne résoudra pas le problème. Si vous avez des itinéraires à votre avis, vous obtiendrez une erreur:

undefined local variable or method 'edit_user_registration_path'

Prend soin de ça.

11
Mindbreaker

vous pouvez remplacer le Devise :: RegistrationsController et l'action de création pour rediriger vers la page souhaitée. Le contrôleur devrait probablement ressembler à ceci:

class User::RegistrationsController < Devise::RegistrationsController

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

end
6
murphyslaw