auth_backends.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from __future__ import unicode_literals
  2. from django.contrib.auth import get_user_model
  3. from django.contrib.auth.backends import ModelBackend
  4. from django.contrib.auth.tokens import default_token_generator
  5. from django.db.models import Q
  6. from django.utils.http import base36_to_int
  7. User = get_user_model()
  8. class MezzanineBackend(ModelBackend):
  9. """
  10. Extends Django's ``ModelBackend`` to allow login via username,
  11. email, or verification token.
  12. Args are either ``username`` and ``password``, or ``uidb36``
  13. and ``token``. In either case, ``is_active`` can also be given.
  14. For login, is_active is not given, so that the login form can
  15. raise a specific error for inactive users.
  16. For password reset, True is given for is_active.
  17. For signup verficiation, False is given for is_active.
  18. """
  19. def authenticate(self, **kwargs):
  20. if kwargs:
  21. username = kwargs.pop("username", None)
  22. if username:
  23. username_or_email = Q(username=username) | Q(email=username)
  24. password = kwargs.pop("password", None)
  25. try:
  26. user = User.objects.get(username_or_email, **kwargs)
  27. except User.DoesNotExist:
  28. pass
  29. else:
  30. if user.check_password(password):
  31. return user
  32. else:
  33. if 'uidb36' not in kwargs:
  34. return
  35. kwargs["id"] = base36_to_int(kwargs.pop("uidb36"))
  36. token = kwargs.pop("token")
  37. try:
  38. user = User.objects.get(**kwargs)
  39. except User.DoesNotExist:
  40. pass
  41. else:
  42. if default_token_generator.check_token(user, token):
  43. return user