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
Si vous souhaitez vous connecter à un utilisateur, utilisez le sign_in
aide dans l'action de votre contrôleur:
sign_in(:user, user)
resource = warden.authenticate!(:scope => resource_name)
sign_in(resource_name, resource)
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
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')