web-dev-qa-db-fra.com

Devise redirection après échec de la connexion

Toutes les questions que j'ai trouvées sont liées à une connexion réussie avec l'assistant after_sign_in_path_for(resource)

J'ai un formulaire de connexion dans l'index du site, et lorsque la connexion échoue, il redirige vers "utilisateurs/signature_in"

Mais comment puis-je rediriger vers mon "site # index" lorsque la connexion échoue?

51
Juanjo
  1. Créez un fichier custom_failure.rb dans votre répertoire lib avec:

    class CustomFailure < Devise::FailureApp
      def redirect_url
        your_path
      end
    
      def respond
        if http_auth?
          http_auth
        else
          redirect
        end
      end
    end
    
  2. Dans votre initialiseur Devise, incluez:

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    
  3. Assurez-vous que Rails charge vos fichiers lib dans votre application.rb:

    config.autoload_paths += %W(#{config.root}/lib)
    

N'oubliez pas de redémarrer votre serveur.

Je ne pense pas qu'il existe un moyen plus facile de faire cela. Bonne chance.

92
Marco Antonio

Si vous utilisez votre propre SessionsController, vous pouvez réaffecter la valeur :recall de auth_options pour rappeler le controller#method souhaité avant d'exécuter warden.authenticate!(auth_options), par exemple:

dans app/controllers/users/sessions_controller.rb

class Users::SessionsController < Devise::SessionsController
  #...
  def create
    #...
    auth_options = { :recall => 'site#index', :scope => :user }
    resource = warden.authenticate!(auth_options)
    #...
  end
  #...
end

De cette façon, vous n'avez pas besoin de créer l'application FailureApp personnalisée et de modifier les configurations.

13
Sibevin Wang

C’est ce qui se passe avec la version 3.1.0

Started POST "/users/sign_in"
Processing by Devise::SessionsController#create
Completed 401 Unauthorized
Processing by Devise::SessionsController#new

new est appelé en raison des auth_options définies à la fin de gems/devise-3.1.0/app/controllers/devise/sessions_controller.rb

Vous devez redéfinir les auth_options utilisées dans l'action create. J'ai copié le contrôleur dans app/controllers/devise/sessions_controller.rb de mon application Rails et remplacé la méthode auth_options comme celle-ci

def auth_options
  { :scope => resource_name, :recall => "Home#new" }
end

C'est l'astuce, mais l'URL est toujours/users/sign_in

Je vais essayer de résoudre ce problème aussi.

3
pmontrasio

Vous pouvez changer le chemin par défaut de sign_in. 

Découvrez https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

1
MikeH

En développant la réponse de Marcao, je recommande fortement de placer debugger dans votre méthode de réponse CustomFailure afin de mieux comprendre ce qui se passe.

Class CustomFailure < Devise::FailureApp
  def respond
    binding.pry
    super
  end
end

Si vous regardez le code source FailureApp Devise pour connaître la méthode de réponse, il est très facile de comprendre ce qui se passe.

def respond
  if http_auth?
    http_auth
  elsif warden_options[:recall]
    recall
  else
    redirect
  end
end

Ainsi, par exemple, pour renvoyer un redirect_url, vous voulez vous assurer que vos conditions de code respond renvoient finalement redirect.

Toutefois, si vous souhaitez peut-être renvoyer un statut 401 standard défini dans la méthode http_auth , vous souhaitez vérifier que votre code de méthode respond renvoie http_auth.

Il est donc intéressant de regarder dans la définition du http_auth? En particulier, notez la méthode: request.xhr?, qui renvoie 0 pour les requêtes json (rappelons que 0 est évalué à true dans Ruby)

def http_auth?
  if request.xhr?
    Devise.http_authenticatable_on_xhr
  else
    !(request_format && is_navigational_format?)
  end
end

Et peut-être vérifier votre fichier initialiseurs/inventé pour config.http_authenticatable_on_xhr ou config.navigational_formats afin de contrôler la réponse souhaitée. Cette configuration peut réellement affecter le retour de Devise et peut souvent conduire à un comportement inattendu du fait de ce qu’elle fait ici sous le capot.

0
AmitF