2 votes

Devise - Exécuter des contrôles après que l'utilisateur se soit connecté, rediriger si erreur

Je travaille sur une application de commerce électronique. Lorsqu'un utilisateur se connecte à mon application, je veux faire une vérification auprès de mon gestionnaire d'abonnement externe et m'assurer que son abonnement est toujours actif et n'a pas expiré/échoué/quelque chose.

J'ai réussi à comprendre comment utiliser un callback Warden dans mon fichier initializers/devise.rb pour effectuer une vérification du modèle après la connexion. Cependant, s'il y a un problème, je veux les déconnecter à nouveau et les rediriger vers une certaine page qui leur indique la marche à suivre.

Voici ce que j'ai. Je sais que je ne peux pas utiliser redirect_to du rappel. Dans ces conditions, quelle est la meilleure façon de faire ce que j'essaie de faire ?

Warden::Manager.after_authentication do |user, auth, opts|
  begin
    user.check_active_subscription # this works, and will raise one of several exceptions if something is goofy
  rescue
    redirect_to "/account/expired" # obviously this won't work, but see what I'm trying to do?
  end
end

8voto

Mischa Points 26200

Il suffit de laisser le callback lever l'exception et de la récupérer dans votre contrôleur. Par exemple :

Warden::Manager.after_authentication do |user, auth, opts|
  user.check_active_subscription
end

class SessionsController < ApplicationController
  def create
    # Authenticate
  rescue SubscriptionExpiredException
    # Logout
    redirect_to "/account/expired"
  end
end

Vous pouvez également utiliser rescue_from dans votre ApplicationController comme ça :

class ApplicationController
  rescue_from SubscriptionExpiredException, :with => :deny_access

  def deny_access
    redirect_to "/account/expired"
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X