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?
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
Dans votre initialiseur Devise, incluez:
config.warden do |manager|
manager.failure_app = CustomFailure
end
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.
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.
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.
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
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.