Implement an authentication backend that will look up the user in the old

community login system in case it's not present in the django auth one,
and if necessary create the object in the django one.
This commit is contained in:
Magnus Hagander
2009-09-16 16:43:46 +02:00
parent d69d8a422c
commit 322da0de7e
2 changed files with 44 additions and 0 deletions

View File

@ -80,6 +80,10 @@ LOGIN_URL='/account/login/'
LOGIN_REDIRECT_URL='/account/'
LOGOUT_URL='/account/logout/'
AUTHENTICATION_BACKENDS = (
'util.auth.AuthBackend',
)
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',

40
pgweb/util/auth.py Normal file
View File

@ -0,0 +1,40 @@
from django.contrib.auth.models import User
from django.contrib.auth.backends import ModelBackend
from django.db import connection
# Special version of the authentication backend, so we can deal with migration
# of accounts from the old community login system. Once we consider all accounts
# migrated, we can remove this one and use the default backend.
class AuthBackend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(username=username)
# If user is found, check the password using the django
# methods alone.
if user.check_password(password):
return user
# User found but password wrong --> tell django it is wrong
return None
except User.DoesNotExist:
# User does not exist. See if it exists in the old system,
# and if it does, migrate it to the new one.
curs = connection.cursor()
curs.execute('SELECT * FROM community_login_old(%s,%s)', (username, password))
rows = curs.fetchall()
if len(rows) != 1:
# No rows returned, something clearly went wrong
return None
if rows[0][1] == 1:
# Value 1 in field 1 means the login succeeded. In this case,
# create a user in the django system, and migrate all settings
# we can think of.
user = User(username=username, password=password, email=rows[0][3], first_name=rows[0][2])
user.save()
return user
# Any other value in field 1 means login failed, so tell django we did
return None
return None # Should never get here, but just in case...