Django: Alterar/permitir que o nome de usuário de login do usuário também use seu e-mail
-
28-09-2019 - |
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.
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