Django: Cambio / Permitir nombre de usuario de inicio de sesión del usuario a utilizar también su / su correo electrónico

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

Pregunta

Como dice mi título, me gustaría saber si hay una manera para permitir a un usuario utilizar no sólo su nombre de usuario, correo electrónico, sino también de su usuario de inicio de sesión. Quiero estandarizar el proceso de inscripción, porque en este momento estoy teniendo mis usuarios utilizan muchas convenciones diferentes y se pone bastante desordenado.

¿Fue útil?

Solución

Probablemente se podría hacer esto si hace cumplir las direcciones de correo electrónico única. Es decir, ningún usuario puede tener la misma dirección de e-mail. De esta manera se pudo obtener el usuario por e-mail y les identificarse.

La forma podría ser algo como esto:

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

El método de vista podría ser algo como esto:

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 podría ser otra manera de ir: http://bit.ly/a2OlHX

Asegúrese de que las direcciones de correo electrónico única por usuario: http://bit.ly/aOaAbw

Otros consejos

creo que 'resuelto' mi problema, por lo menos es funcional, por ahora. Decidí usar mi propio motor de autenticación. He creado un 'auth_backends.py' archivo y añadí a AUTHENTICATION_BACKENDS en mi settings.py:

Mis campos de formulario de inicio de sesión sólo contienen 'nombre de usuario' y la contraseña. La única manera de que estoy haciendo para comprobar si el nombre de usuario introducido es de hecho su nombre de usuario o e-mail, es haciendo la .find ( '@'). ¿Hay una mejor manera de comprobar para ello? ¿Sería esto suficiente? La razón por la que estoy haciendo esto es porque es más fácil para el usuario a recordar su / su correo electrónico que su nombre de usuario (que es en realidad un 'id' que consiste en los números).

También voy a tener que cuidar de correos electrónicos duplicados.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top