Concevoir - Comment interdire à certains utilisateurs de se connecter?

105

J'utilise Devise pour l'authentification dans mon application.

Comment interdire à certains utilisateurs de se connecter - sorte de désactiver un utilisateur?

Dimitar Vouldjeff
la source
42
Ceci est une question valable et devrait être rouverte - OP demande : « Comment puis-je défends certains utilisateurs de se connecter » avec legs .
Zabba le

Réponses:

149

Fais-le comme ça:

Créez une colonne appelée is_activepour le Usermodèle.

Ajoutez ensuite le code ci-dessous au Usermodèle:

class User < ActiveRecord::Base
  #this method is called by devise to check for "active" state of the model
  def active_for_authentication?
    #remember to call the super
    #then put our own check to determine "active" state using 
    #our own "is_active" column
    super and self.is_active?
  end
end

METTRE À JOUR

Comme le note Matt Huggins, la méthode s'appelle désormais active_for_authentication?( Documentation )

Zabba
la source
21
On dirait que cela a été renommé au active_for_authentication?lieu de juste active?.
Matt Huggins
1
the method is now called active_for_authentication?signifie que le nom de votre méthode doit être active_for_authentication?au lieu de active?.
fotanus
Remarque importante: active_for_authentication?doit être une méthode publique!
Mladen Jablanović
super and self.is_active?peut être simplifié àsuper && is_active?
David
17

Ajouter une colonne au Usermodèle: allowed_to_log_in.

Ajoutez ensuite ceci à /app/models/user.rb:

def active_for_authentication?
    super and self.allowed_to_log_in?
end

Si vous souhaitez informer l'utilisateur avec un message personnalisé, vous pouvez également l'ajouter:

def inactive_message
    "You are not allowed to log in."
end

Je pense que c'est assez important car le message standard de Devise dit:

"Votre compte n'est pas encore activé."

C'est déroutant pour les utilisateurs et la vraie raison est que vous leur avez "interdit" de se connecter.

Oyvkva
la source
J'implémente une fonction de suspension des utilisateurs qui fonctionne, mais le message inactive "Votre compte est actuellement suspendu" est également affiché pour les inscriptions des utilisateurs. Puis-je avoir différents messages inactifs pour l'activation d'un nouveau compte et la suspension de l'utilisateur?
Dercni
Merci pour le commentaire inactive_message.
Chris Farmer
0

Vous voulez faire une autorisation, pas une authentification. Cependant, Devise ne fait que l'authentification.
C'est-à-dire que la conception vous indique seulement qu'un utilisateur est celui qu'il prétend être.
Vous avez besoin d'autre chose pour lui interdire d'utiliser le site.

L'autorisation est un sujet populaire et il existe toute une liste de gemmes qui peuvent vous aider:
http://ruby-toolbox.com/categories/rails_authorization.html
Faites votre choix.

x10
la source
6
Je connais la différence. Le fait est que je veux interdire à l'utilisateur de se connecter, sans accéder à certains contrôleurs.
Dimitar Vouldjeff