"""
@author: chris
"""
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from django.forms.fields import email_re
class EmailBackend(ModelBackend):
"""
Authenticates against django.contrib.auth.models.User.
"""
def authenticate(self, username=None, password=None):
#If username is an email address, then try to pull it up
if email_re.search(username):
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
return None
else:
#We have a non-email address username we should try username
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return None
if user.check_password(password):
return user
Comments
thanx, very nice example
#
thanks, i had a hard time figuring out the correct solution due to all the comments in the /snippets/74/ thread.
#
Check out: http://bitbucket.org/jokull/django-email-login/
Also includes a simple django-registration backend and forms. Requires a recent checkout of Django.
#
Nice solution, thank you.
I did find a tiny edge-case problem with users who registered on my site, unregistered themselves, then re-registered again because this caused the
User.objects.get()line to return > 1 result. To fix it, simply change,user = User.objects.get(email=username)touser = User.objects.get(email=username, is_active=True)on lines 16 and 22.#
I've posted updated version for django 1.3
#