Files
santeh-ray/users/auth_backends.py
Azimkin d0651274d6
All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
feat: add custom authentication backend to support login with email or username
- 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
2026-04-21 18:09:52 +02:00

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