Django: Modifica / Permettere nome utente login per l'utente di utilizzare anche il suo / la sua e-mail
-
28-09-2019 - |
Domanda
Come il mio titolo dice, voglio sapere se c'è un modo per consentire a un utente di utilizzare non solo il suo nome utente, ma anche e-mail del suo utente di login. Voglio uniformare la procedura di login, perché in questo momento sto avendo i miei utenti utilizzano molte convenzioni diverse e diventa piuttosto disordinato.
Soluzione
Si potrebbe probabilmente fare questo se far rispettare indirizzi email unici. Ciò significa che nessun utente può avere lo stesso indirizzo e-mail. In questo modo si potrebbe recuperare l'utente in base all'indirizzo e-mail e il login.
Il modulo potrebbe essere simile a questo:
<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>
Il metodo di visualizzazione potrebbe essere simile a questo:
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 potrebbe essere un altro modo per andare: http://bit.ly/a2OlHX
Assicurarsi indirizzi e-mail uniche per utente: http://bit.ly/aOaAbw
Altri suggerimenti
penso 'risolto' il mio problema, almeno è funzionale, per ora. Ho deciso di usare il mio backend di autenticazione. Ho creato un file 'auth_backends.py' e ha aggiunto al AUTHENTICATION_BACKENDS nel mio settings.py:
I miei campi del modulo d'accesso contiene solo 'username' e la password. L'unico modo che sto facendo per controllare se il nome utente inserito è in realtà il suo nome utente o e-mail, è facendo il .find ( '@'). C'è un modo migliore per verificare la presenza di esso? Questo sarebbe sufficiente? Tutta la ragione che sto facendo questo è perché è più facile per l'utente a ricordare il suo / la sua e-mail che il suo nome utente (che è in realtà un 'id' costituiti da numeri).
Ho anche intenzione di avere a prendersi cura di messaggi di posta elettronica duplicati.
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