Django: Modification / Autoriser le nom d'utilisateur de connexion de l'utilisateur à utiliser aussi son / son e-mail

StackOverflow https://stackoverflow.com/questions/4267627

Question

Comme mon titre dit, je veux savoir si je il y a un moyen de permettre à un utilisateur non seulement d'utiliser son nom d'utilisateur, mais aussi l'e-mail à connexion de son utilisateur. Je veux normaliser la procédure de connexion, car au moment où je vais avoir mes utilisateurs utilisent de nombreuses conventions différentes et il est assez compliqué.

Était-ce utile?

La solution

Vous pourriez probablement faire si vous appliquez adresses e-mail uniques. Signification aucun utilisateur ne peut avoir la même adresse e-mail. De cette façon, vous pouvez chercher l'utilisateur par adresse e-mail et les connecter.

La forme pourrait ressembler à ceci:

<form method="post" action="{% url myproject.views.login %}">
     <p>Username</p>
     <input type='text' name='username'/>

     <p>Password</p>
     <input type='password' name='password'/>
     <input type="submit" value="Login"/>
</form>

La méthode de vue pourrait ressembler à ceci:

def login( request ):
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.filter( email = username )[0]
    if( user is not None ):
         # -- the user was retrieved by an email address
         # -- now you can authenticate and log them in log them in
         from django.contrib import auth
         user = auth.authenticate( user.username, password )
         if( user is not None ):
              auth.login( user, request )

peut-être une autre qu'OpenID chemin à parcourir: http://bit.ly/a2OlHX

Assurez-vous des adresses de messagerie unique par utilisateur: http://bit.ly/aOaAbw

Autres conseils

Je crois que je résolu mon problème, au moins il est fonctionnel, pour l'instant. J'ai décidé d'utiliser mon propre backend d'authentification. J'ai créé un fichier « auth_backends.py » et ajouté à AUTHENTICATION_BACKENDS dans mon settings.py:

Mon formulaire de connexion champs ne contiennent que « nom d'utilisateur » et le mot de passe. La seule façon que je fais pour vérifier si le nom d'utilisateur saisi est en fait son nom d'utilisateur ou e-mail, est en faisant le .Find ( « @ »). Y at-il une meilleure façon de vérifier cela? Serait-ce suffisant? La seule raison pour laquelle je fais c'est parce qu'il est plus facile pour l'utilisateur de se rappeler son / son e-mail que son nom d'utilisateur (qui est en fait un « id » composé de chiffres).

Je vais aussi devoir prendre soin des e-mails en double.

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User

class CustomUserModelBackend(ModelBackend):

def authenticate(self, **credentials):
    if 'username' in credentials:
        if credentials['username'].find('@') > 0:
            return self.authenticate_by_email(**credentials)
        else:
            return self.authenticate_by_username(**credentials)

def authenticate_by_username(self, username=None, password=None):
    try:
        user = User.objects.get(username=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None

def authenticate_by_email(self, username=None, password=None):
    try:
        user = User.objects.get(email=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top