59 votes

RdR Devise : Connectez-vous avec votre nom d'utilisateur OU votre adresse e-mail

Quelle est la meilleure façon de permettre aux utilisateurs de se connecter avec leur adresse électronique OU leur nom d'utilisateur ? J'utilise warden + devise pour l'authentification. Je pense qu'il ne sera probablement pas trop difficile de le faire, mais je pense que j'ai besoin de conseils pour savoir où mettre tout ce qui est nécessaire. Peut-être devise fournit-il déjà cette fonctionnalité ? Par exemple, vous écririez dans le fichier config/initializers/devise.rb :

config.authentication_keys = [ :email, :username ]

Pour exiger à la fois le nom d'utilisateur ET l'adresse électronique pour la signature. Mais je veux vraiment n'avoir qu'un seul champ pour le nom d'utilisateur et l'email et n'exiger qu'un seul d'entre eux. Je vais juste visualiser cela avec un peu d'art ASCII, cela devrait ressembler à quelque chose comme ceci dans la vue :

Username or Email:
[____________________]

Password:
[____________________]

[Sign In]

46voto

p11y Points 14785

Modifier le code ci-dessous fonctionne, mais je pense qu'il est plus joli de faire cela (seulement des rails) :

def self.find_for_database_authentication(conditions={})
  self.where("username = ?", conditions[:email]).limit(1).first ||
  self.where("email = ?", conditions[:email]).limit(1).first
end

Modifier comme l'ont souligné @sguha et @Chetan, Une autre excellente ressource est disponible sur le wiki officiel de devise. .


Après de nombreuses recherches, j'ai trouvé une solution à ce problème. Je n'en suis pas tout à fait satisfait (je préférerais avoir un moyen de spécifier cela dans l'initialisateur), mais cela fonctionne pour le moment. Dans le modèle utilisateur, j'ai ajouté la méthode suivante :

def self.find_for_authentication(conditions={})
  unless conditions[:email] =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i # email regex
    conditions[:username] = conditions.delete("email")
  end
  super
end

ceci remplace la méthode devise find_for_authentication qui normalement ne trouve que le premier enregistrement basé sur les conditions données. Cette version modifiée vérifie si l'utilisateur a réellement tapé une adresse électronique dans le champ "email". Si ce n'est pas le cas, elle revient à la vérification du nom d'utilisateur. Ce court article de blog couvre exactement ce sujet et m'a beaucoup aidé. (edit : site down)

25voto

9voto

def self.find_for_authentication(conditions)
  conditions = ["username = ? or email = ?", conditions[authentication_keys.first], conditions[authentication_keys.first]]
  # raise StandardError, conditions.inspect
  super
end

Utilisez leur exemple !

7voto

aku Points 61

Assurez-vous que vous avez déjà ajouté le champ username et ajoutez username à attr_accessible. Créez un attribut virtuel de connexion dans Users

1) Ajouter le login comme un attr_accessor

# Virtual attribute for authenticating by either username or email
# This is in addition to a real persisted field like 'username'
attr_accessor :login

2) Ajouter le login à attr_accessible

attr_accessible :login

Dites à Devise d'utiliser :login dans les clés d'authentification.

Modifiez config/initializers/devise.rb pour avoir :

config.authentication_keys = [ :login ]

Écraser la méthode find_for_database_authentication de Devise dans Users

# Overrides the devise method find_for_authentication
# Allow users to Sign In using their username or email address
def self.find_for_authentication(conditions)
  login = conditions.delete(:login)
  where(conditions).where(["username = :value OR email = :value", { :value => login }]).first
end

Mettez à jour vos vues Assurez-vous d'avoir les vues Devise dans votre projet afin de pouvoir les personnaliser.

remove <%= f.label :email %>
remove <%= f.email_field :email %>
add <%= f.label :login %>   
add <%= f.text_field :login %>

2voto

Kulbir Saini Points 2600

https://gist.github.com/867932 : Une seule solution pour tout. Ouverture de session, mot de passe oublié, confirmation, instructions de déverrouillage.

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