Django: Ändern / Zulassen von Login-Benutzernamen des Benutzers auch seine / ihre E-Mail verwenden

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

Frage

Wie mein Titel schon sagt, ich möchte wissen, ob ich eine Art und Weise gibt es einen Benutzer zu erlauben, seinen Benutzernamen zu verwenden, nicht nur, sondern auch auf Login seine Benutzer-E-Mail. Ich möchte das Anmeldeverfahren standardisieren, weil im Moment Ich habe meine Benutzer viele verschiedene Konventionen verwenden und es wird ziemlich chaotisch.

War es hilfreich?

Lösung

Sie könnten wahrscheinlich dies tun, wenn Sie eindeutige E-Mail-Adressen erzwingen. keinen Benutzers Bedeutung kann die gleiche E-Mail-Adresse hat. Auf diese Weise könnten Sie den Benutzer per E-Mail-Adresse holen, und melden sie in.

Die Form könnte wie folgt aussehen:

<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>

Die Ansicht Methode könnte wie folgt aussehen:

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 )

OpenID könnte ein weiterer Weg zu gehen: http://bit.ly/a2OlHX

Stellen Sie sicher, eindeutige E-Mail-Adressen pro Benutzer: http://bit.ly/aOaAbw

Andere Tipps

Ich glaube, ich ‚gelöst‘ mein Problem, zumindest ist es funktional, für jetzt. Ich beschloss, meinen eigenen Authentifizierungs-Backend zu verwenden. Ich habe eine Datei ‚auth_backends.py‘ und es AUTHENTICATION_BACKENDS in meinem settings.py hinzugefügt:

Meine Login-Formular-Felder enthalten nur ‚username‘ und Ihr Passwort ein. Der einzige Weg, ich mache, wenn der eingegebene Benutzername ist in der Tat seine Benutzername oder E-Mail zu überprüfen, ist durch die .find tun ( ‚@‘). Gibt es einen besseren Weg, es zu überprüfen? Wäre das genug? Der ganze Grund, warum ich das tue, weil es einfacher ist, dass der Benutzer seine / ihre E-Mail als seine Benutzername (die aus Zahlen tatsächlich ein ‚id‘ ist) zu erinnern.

Ich werde auch um doppelte E-Mails zu nehmen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top