diff --git a/app/bloonsa_game/migrations/0025_alter_level_title.py b/app/bloonsa_game/migrations/0025_alter_level_title.py new file mode 100644 index 0000000..d5c0758 --- /dev/null +++ b/app/bloonsa_game/migrations/0025_alter_level_title.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.6 on 2025-02-21 03:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('bloonsa_game', '0024_config'), + ] + + operations = [ + migrations.AlterField( + model_name='level', + name='title', + field=models.CharField(max_length=64), + ), + ] diff --git a/app/settings/settings.py b/app/settings/settings.py index dc265a3..b1c0ea1 100644 --- a/app/settings/settings.py +++ b/app/settings/settings.py @@ -123,6 +123,9 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +AUTHENTICATION_BACKENDS = ( + "users.backends.CaseInsensitiveModelBackend", # inherits from 'django.contrib.auth.backends.ModelBackend' +) # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ diff --git a/app/users/backends.py b/app/users/backends.py new file mode 100644 index 0000000..4353671 --- /dev/null +++ b/app/users/backends.py @@ -0,0 +1,21 @@ +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth import get_user_model + +from users.models import User + +class CaseInsensitiveModelBackend(ModelBackend): + def authenticate(self, username=None, password=None, **kwargs): + UserModel = get_user_model() + if username is None: + username = kwargs.get(UserModel.USERNAME_FIELD) + try: + d = {'%s__iexact'%UserModel.USERNAME_FIELD: username} + user = UserModel.objects.get(**d) + if user.check_password(password): + return user + except UserModel.DoesNotExist: + # Run the default password hasher once to reduce the timing + # difference between an existing and a non-existing user (#20760). + UserModel().set_password(password) + + return None