2010-11-10 3 views
7

J'ai une application Rails en utilisant Devise pour l'authentification. Les utilisateurs appartiennent aux concessionnaires et je veux empêcher les utilisateurs appartenant à des revendeurs handicapés de pouvoir se connecter.Filtrage des utilisateurs qui peuvent se connecter avec Devise

est-il un moyen simple de étendre le viseur d'authentification de Devise afin qu'il ne comprend pas les utilisateurs des concessionnaires supprimés? Peut-être en utilisant une portée nommée sur l'utilisateur?

Vive

Tristan

Répondre

15

Turns sur tout ce que je devais faire était passer outre la méthode de find_for_authentication de mon modèle utilisateur:

class User < ActiveRecord::Base 
    ... 

    # Intercept Devise to check if DealershipUser's Dealership is active 
    def self.find_for_authentication(conditions) 
    user = super 
    return nil if user.is_a?(DealershipUser) && user.dealership.deleted? 
    user 
    end 

    ... 
end 
  1. Trouver l'utilisateur de façon normale en appelant super. J'utilise STI pour vérifier que l'utilisateur est un DealershipUser et ensuite vérifier si le concessionnaire est supprimé (acts_as_paranoid).
  2. Retourne l'utilisateur.

Ceci est une solution très spécifique pour mon scénario, mais vous pouvez remplacer find_for_authentication comme bon vous semble, à condition que vous retourniez l'utilisateur par la suite.

+2

Mi-2013, et cela fonctionne toujours. –

4

Recherche Stackoverflow.com m'a donné cette question/réponse: Custom authentication strategy for devise

Fondamentalement, vous devez mettre en œuvre une stratégie d'authentification personnalisée au niveau de Warden (qui sous-tend Devise). Pour mon projet, je l'ai fait ce qui suit:

En config/initializers/devise.rb:

Devise.setup do |config| 
    config.warden do |manager| 
    manager.default_strategies(:scope => :user).unshift :user_has_login_access 
    end 
end 

Warden::Strategies.add(:user_has_login_access) do 
    def valid? 
    # pass the commit parameter as 'login' or something like that, so that this strategy only activates when the user is trying to login 
    params[:commit] == 'login' 
    end 

    def authenticate! 
    u = User.find_by_email(params[:user][:email]) 
    if u.can_login? # retrieves boolean value stored in the User model, set wherever 
     success! u 
    else 
     fail! "Account does not have login privilages." 
    end 
    end 
end 

Vous pouvez en savoir plus sur les stratégies personnalisées Warden ici: https://github.com/hassox/warden/wiki/Strategies

Hope that helps!

+0

Il s'avère que je pourrais remplacer find_for_authentication (voir ci-dessous). Merci pour votre réponse, cependant, cela a peut-être éclairé un autre problème que je suis en train de résoudre. – tristanm

Questions connexes