From 322da0de7e21baac2f841cbe81b36fc757c20614 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Wed, 16 Sep 2009 16:43:46 +0200 Subject: [PATCH] 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. --- pgweb/settings.py | 4 ++++ pgweb/util/auth.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 pgweb/util/auth.py diff --git a/pgweb/settings.py b/pgweb/settings.py index d7c88b84..0bf62a98 100644 --- a/pgweb/settings.py +++ b/pgweb/settings.py @@ -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', diff --git a/pgweb/util/auth.py b/pgweb/util/auth.py new file mode 100644 index 00000000..e140ef67 --- /dev/null +++ b/pgweb/util/auth.py @@ -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... +