All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
- Implemented `EmailOrUsernameBackend` to allow authentication via email or username - Updated settings to include the new authentication backend - Modified tests to cover email-based login scenarios - Fixed user lookup logic in forms to handle case-insensitive email matching
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
from django.contrib.auth.backends import ModelBackend
|
|
from django.contrib.auth import get_user_model
|
|
|
|
|
|
UserModel = get_user_model()
|
|
|
|
|
|
class EmailOrUsernameBackend(ModelBackend):
|
|
def authenticate(self, request, username=None, password=None, **kwargs):
|
|
if username is None:
|
|
username = kwargs.get(UserModel.USERNAME_FIELD)
|
|
|
|
if username is None or password is None:
|
|
return None
|
|
|
|
user = self._get_user_by_username_or_email(username)
|
|
if user is None:
|
|
return None
|
|
|
|
if user.check_password(password) and self.user_can_authenticate(user):
|
|
return user
|
|
|
|
return None
|
|
|
|
def _get_user_by_username_or_email(self, value):
|
|
try:
|
|
return UserModel._default_manager.get_by_natural_key(value)
|
|
except UserModel.DoesNotExist:
|
|
email_field = UserModel.get_email_field_name()
|
|
try:
|
|
return UserModel._default_manager.get(**{f"{email_field}__iexact": value})
|
|
except UserModel.DoesNotExist:
|
|
return None
|
|
except UserModel.MultipleObjectsReturned:
|
|
return None
|