web-dev-qa-db-fra.com

Comment connecter un utilisateur avec devise?

J'ai mon Rails application et je rencontre un problème majeur avec devise. J'ai un contrôleur:

class Users::SessionsController < Devise::SessionsController
  prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
  include Devise::Controllers::InternalHelpers

def new
    clean_up_passwords(build_resource)

    respond_to do |format|
      format.html { render :layout => "sessions" }
      format.mobile
    end
  end


    # POST /resource/sign_in
    def create
      resource = User.find_by_email(params[:user][:email])  
      resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
      set_flash_message :notice, :signed_in
      sign_in_and_redirect(resource_name, resource)
    end

end

Le problème est qu'il ne connecte jamais l'utilisateur, il s'arrête toujours à cette ligne

resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")

J'ai même mis des tonnes d'enregistreurs dans les fichiers gem réels pour voir si je pouvais voir quoi que ce soit, mais rien et je n'ai vraiment aucune idée de comment résoudre ce problème. Si je commente cette ligne, l'utilisateur se connecte mais échoue si l'e-mail n'est pas dans la base de données et fonctionne pour n'importe quel mot de passe (ce qui n'est certainement pas la bonne solution)

Comment puis-je réparer ça?

METTRE À JOUR

cela fonctionne mais semble très hackish

# POST /resource/sign_in
def create
  resource = User.find_by_email(params[:user][:email])

  redirect_to(new_user_session_path, :notice => 'Invalid Email Address or Password. Password is case sensitive.') and return if resource.encrypted_password.blank?      
  bcrypt   = BCrypt::Password.new(resource.encrypted_password)
  password = BCrypt::Engine.hash_secret("#{params[:user][:password]}#{resource.class.pepper}", bcrypt.salt)
  valid = Devise.secure_compare(password, resource.encrypted_password)
 # resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
  if valid
    set_flash_message :notice, :signed_in
    sign_in_and_redirect(resource_name, resource)
  else
    redirect_to(new_user_session_path, :notice => 'Invalid Email Address or Password. Password is case sensitive.') and return    
  end

end
35
Matt Elhotiby

Si vous souhaitez vous connecter à un utilisateur, utilisez le sign_in aide dans l'action de votre contrôleur:

sign_in(:user, user)
75
Ryan Bigg
  resource = warden.authenticate!(:scope => resource_name)
   sign_in(resource_name, resource)
2
Mike

Voici comment fonctionnent les actions create standard:

  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb#L18

0
Artur Beljajev

J'ai trouvé ce message utile pour configurer une connexion pour les spécifications de la demande. https://makandracards.com/makandra/37161-rspec-devise-how-to-sign-in-users-in-request-specs

module DeviseRequestSpecHelpers

  include Warden::Test::Helpers

  def sign_in(resource_or_scope, resource = nil)
    resource ||= resource_or_scope
    scope = Devise::Mapping.find_scope!(resource_or_scope)
    login_as(resource, scope: scope)
  end

  def sign_out(resource_or_scope)
    scope = Devise::Mapping.find_scope!(resource_or_scope)
    logout(scope)
  end

end

Incluez-le dans votre spec_helper

RSpec.configure do |config|
  config.include DeviseRequestSpecHelpers, type: :request
end

Et connectez-vous au besoin

sign_in create(:user, name: 'John Doe')

0
Clam