Django: Alterar/permitir que o nome de usuário de login do usuário também use seu e-mail

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

Pergunta

Como diz meu título, quero saber se existe uma maneira de permitir que um usuário use não apenas o nome de usuário, mas também o e -mail do usuário para fazer o login. Quero padronizar o procedimento de login, porque no momento estou fazendo com que meus usuários usem muitas convenções diferentes e isso fica muito confuso.

Foi útil?

Solução

Você provavelmente poderia fazer isso se aplicar endereços de email exclusivos. Significado nenhum usuário pode ter o mesmo endereço de e-mail. Dessa forma, você pode buscar o usuário por e-mail e registrá-los.

O formulário pode parecer algo assim:

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

O método de visualização pode parecer algo assim:

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 pode ser outro caminho a percorrer: http://bit.ly/a2olhx

Verifique se os endereços de email exclusivos por usuário: http://bit.ly/aoaabw

Outras dicas

Eu acho que resolvi meu problema, pelo menos é funcional, por enquanto. Decidi usar meu próprio back -end de autenticação. Criei um arquivo 'auth_backends.py' e adicionei -o para autenticação_backends no meu set setents.py:

Meus campos de formulário de login contêm apenas 'nome de usuário' e senha. A única maneira de fazer verificar se o nome de usuário inserido é de fato seu nome de usuário ou e -mail é fazer o .find ('@'). Existe uma maneira melhor de verificar isso? Isso seria suficiente? A razão pela qual estou fazendo isso é porque é mais fácil para o usuário lembrar seu e -mail do que o nome de usuário (que na verdade é um 'id' que consiste em números).

Também vou ter que cuidar de e -mails 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top