Normalerweise wird der Benutzer mit der Spalte "USERNAME_FIELD" und "password" der Klasse authentifiziert, die "AbstractBaseUser" erbt. Fügen wir eine neue Spalte mit dem Namen "login_id" hinzu, damit wir Benutzer auch mit "login_id" und "password" authentifizieren können.
AUTHENTICATION_BACKENDS
hinzuIch möchte die Benutzerauthentifizierung anpassen, also füge "AUTHENTICATION_BACKENDS" hinzu Siehe Referenz für "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_ID- und Passwort-Login
"""
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',
]
Es wird davon ausgegangen, dass die Benutzertabelle eine login_id-Spalte enthält
AUTHENTICATION_BACKENDS
kann der Reihe nach aufgerufen werden, z. B. die nächste Authentifizierung, wenn die definierte Authentifizierung fehlschlägt.
Führen Sie also zuerst die bisherige Authentifizierung durch. Wenn dies fehlschlägt, wird die Authentifizierung mit der Anmelde-ID ausgeführt.
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
Bitte fügen Sie auch zu urls.py hinzu
Dieses Mal habe ich eine andere API verwendet, aber je nach Logik ist es meiner Meinung nach möglich, sich mit einer API anzumelden, beispielsweise mit einer E-Mail-Adresse oder einer Anmelde-ID.
Recommended Posts