it-swarm-pt.tech

desativando o registro do Devise apenas para o ambiente de produção

Estou lançando um site beta com um grupo seleto de usuários. Desejo desativar o registro apenas no ambiente de produção e apenas por um curto período de tempo (ou seja, não quero destruir completamente meu registro). Sei que posso simplesmente ocultar o link "inscrição", mas suspeito que os hackers mais espertos do que eu ainda possam usar as rotas RESTful para realizar registros. Qual é a melhor maneira de desativar o registro para que meus ambientes de teste/desenvolvimento ainda funcionem, mas a produção seja afetada? Obrigado por qualquer indicação.

Tentei apontar escopos nomeados de forma que "sign_up" vá para "sign_in", mas não funcionou. Aqui está o que eu tentei:

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

Idealmente, enviaríamos o usuário para uma página "pages # registration_disabled" ou algo assim. Eu só queria trabalhar com algo que eu possa brincar.

EDIT: Alterei o modelo conforme solicitado e adicionei o seguinte ao /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

está passando como "verdadeiro" ao invés de falso. Existe uma maneira de simular o ambiente de produção? Estou apenas cuspindo esse aqui.

Obrigado!

69
panzhuli

Como outros estão tendo o problema que estou tendo (veja meus comentários). Aqui está exatamente como eu o consertei. Eu usei a ideia de murphyslaw. Mas você também precisa garantir que o devise use seu novo controlador para o roteamento de registro, ou isso não fará muito por você.

Aqui está a substituição do meu controlador:

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

Adicionei mensagens em flash para informar quem de alguma forma se depara com a página de registro por que ela não está funcionando.

Aqui está o que está no meu routes.rb

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

O hash dos controladores especifica que eu quero que ele use meu controlador de registros substituído.

De qualquer forma, espero que isso poupe a alguém algum tempo.

88
Chris Nicola

Edite o modelo user e remova :registerable, Acho que isso deve dar o que você deseja.

Editar:

Eu acho que isso iria funcionar:

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

Remova apenas :registerable não resolverá o problema. Se você tiver algumas rotas em sua exibição, receberá um erro:

undefined local variable or method 'edit_user_registration_path'

Cuide disso.

11
Mindbreaker

você pode substituir o Devise :: RegistrationsController e a ação create para redirecionar para a página desejada. O controlador provavelmente deve ser algo como isto:

class User::RegistrationsController < Devise::RegistrationsController

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

end
6
murphyslaw