[Users] fix number of queries during login
[mygpo.git] / mygpo / users / backend.py
blob72158deeb1a6957feaf66baf6629a853efaf84cb
1 from django.contrib.auth import get_user_model
2 from django.contrib.auth.backends import ModelBackend
4 import logging
5 logger = logging.getLogger(__name__)
8 class CaseInsensitiveModelBackend(ModelBackend):
9 """ Authenticates with a case-insensitive username """
11 def authenticate(self, username=None, password=None, **kwargs):
12 UserModel = get_user_model()
13 users = UserModel.objects.filter(username__iexact=username)\
14 .order_by('-last_login')
15 users = list(users)
16 if len(users) == 0:
17 # Run the default password hasher once to reduce the timing
18 # difference between an existing and a non-existing user (#20760).
19 UserModel().set_password(password)
20 return None
22 if len(users) > 1:
23 logger.error('Login with non-unique username: %s', username)
25 user = users[0]
26 if user.check_password(password):
27 return user