Normalement, l'utilisateur est authentifié avec la colonne définie par ʻUSERNAME_FIELD et
password de la classe qui hérite de ʻAbstractBaseUser
.
Ajoutons une nouvelle colonne appelée login_id
afin que nous puissions également authentifier les utilisateurs avec login_id
et password
.
Je souhaite personnaliser l'authentification utilisateur, alors ajoutez ʻAUTHENTICATION_BACKENDS Voir la référence pour ʻAUTHENTICATION_BACKENDS
https://docs.djangoproject.com/en/dev/ref/settings/#authentication-backends
backends.py
from django.contrib.auth.backends import ModelBackend
from project.models.user import User
class LoginIdModelBackend(ModelBackend):
"""
login_identifiant et mot de passe
"""
def authenticate(self, request, username=None, password=None, **kwargs):
try:
login_id = kwargs.get('login_id')
if not login_id:
raise User.DoesNotExist
user = User.objects.get(login_id=login_id)
except User.DoesNotExist:
# Run the default password hasher once to reduce the timing
# difference between an existing and a nonexistent user (#20760).
User().set_password(password)
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user
settings.py
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'backends.LoginIdModelBackend',
]
On suppose que la table User a une colonne login_id ʻAUTHENTICATION_BACKENDS` peut être appelé dans l'ordre, comme la prochaine authentification si l'authentification définie échoue. Donc, effectuez d'abord l'authentification jusqu'à présent, et si cela échoue, l'authentification avec l'ID de connexion sera exécutée.
login_id
et password
views/auth.py
from rest_framework_simplejwt.views import TokenViewBase
from project import serializers
class LoginIdAuthTokenViewSet(TokenViewBase):
serializer_class = serializers.LoginIdAuthTokenSerializer
serializer/auth.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class LoginIdAuthTokenSerializer(TokenObtainPairSerializer):
username_field = 'login_id'
def create(self, validated_data):
pass
def update(self, instance, validated_data):
pass
Veuillez également ajouter à urls.py
Cette fois, j'ai utilisé une API différente, mais selon la logique, je pense qu'il est possible de se connecter avec une API, par exemple avec une adresse e-mail ou un identifiant de connexion.
Recommended Posts