Possiamo farlo implementando il nostro backend di autenticazione Email.
Si può fare qualcosa di simile di seguito:
Step-1 Substite il modello utente personalizzata nelle impostazioni:
Dal momento che non sarebbe utilizzando il modello predefinito User
di Django per l'autenticazione, è necessario definire il nostro modello personalizzato MyUser
in settings.py
. Specificare MyUser
come AUTH_USER_MODEL
nelle impostazioni del progetto.
AUTH_USER_MODEL = 'myapp.MyUser'
Step-2 Scrivi la logica per il backend di autenticazione personalizzato:
a scrivere le nostre backend di autenticazione, abbiamo bisogno di implementare atleast due metodi cioè get_user(user_id)
e authenticate(**credentials)
.
from django.contrib.auth import get_user_model
from django.contrib.auth.models import check_password
class MyEmailBackend(object):
"""
Custom Email Backend to perform authentication via email
"""
def authenticate(self, username=None, password=None):
my_user_model = get_user_model()
try:
user = my_user_model.objects.get(email=username)
if user.check_password(password):
return user # return user on valid credentials
except my_user_model.DoesNotExist:
return None # return None if custom user model does not exist
except:
return None # return None in case of other exceptions
def get_user(self, user_id):
my_user_model = get_user_model()
try:
return my_user_model.objects.get(pk=user_id)
except my_user_model.DoesNotExist:
return None
Step-3 Specificare l'autenticazione back-end personalizzato nelle impostazioni:
Dopo aver scritto l'autenticazione back-end personalizzato, specificare questo backend di autenticazione nell'impostazione AUTHENTICATION_BACKENDS
.
AUTHENTICATION_BACKENDS
contiene l'elenco dei back-end di autenticazione da utilizzare. Django prova ad autenticare attraverso tutti i suoi backend di autenticazione. Se il primo metodo di autenticazione fallisce, Django tenta il secondo, e così via, fino a quando tutti i backend sono stati tentati.
AUTHENTICATION_BACKENDS = (
'my_app.backends.MyEmailBackend', # our custom authentication backend
'django.contrib.auth.backends.ModelBackend' # fallback to default authentication backend if first fails
)
Se l'autenticazione tramite MyEmailBackend
non riesce utente cioè non poteva essere autenticati via email
, allora usiamo l'autenticazione di default del Django ModelBackend
che cercherà di autenticarsi tramite username
campo della MyUser
modello.
Ho creato un back-end di autenticazione personalizzato simile ora voglio passare i campi di posta elettronica e numero di telefono anche mentre eseguo l'accesso a questo metodo. Ma ottengo solo il nome utente e il campo password kwargs è vuoto Qualsiasi idea come ottenere tutti i campi? – Kishan
Puoi pubblicare il codice di esempio che stai provando? –