Problem mit benutzerdefiniertem Authentifizierungs-Backend für Django
Ich habe ein Problem mit einem benutzerdefinierten Authentifizierungs-Backend, das ich für ein Active Directory über LDAP-Authentifizierung erstellt habe.
Das Problem besteht darin, dass ich von der Administratoranmeldeseite aus, nachdem der neue Benutzer ordnungsgemäß authentifiziert und in der Datenbank erstellt wurde (oder seine Informationen vom LDAP-Server aktualisiert wurden), zur Administratoranmeldeseite zurückkomme und darauf hinweise, dass ich keine gültige eingegeben habe Benutzername und Passwort.
Was mache ich falsch, wenn der Benutzer in der Django-Datenbank authentifiziert und aktualisiert wird?
Der Code:
import ldap
import re
from django.conf import ad_settings
grps = re.compile(r'CN=(\w+)').findall
def anyof(short_group_list, adu):
all_groups_of_user = set(g for gs in adu.get('memberOf',()) for g in grps(gs))
return any(g for g in short_group_list if g in all_groups_of_user)
class ActiveDirectoryBackend(ModelBackend):
"""
This backend utilizes an ActiveDirectory server via LDAP to authenticate
users, creating them in Django if they don't already exist.
"""
def authenticate(self, username=None, password=None):
con = None
ldap.set_option(ldap.OPT_REFERRALS, 0)
try:
con = ldap.initialize('ldap://%s:%s' % (ad_settings.AD_DNS_NAME,
ad_settings.AD_LDAP_PORT))
con.simple_bind_s(username+"@"+ad_settings.AD_DNS_NAME, password)
ADUser = con.search_ext_s(ad_settings.AD_SEARCH_DN,
ldap.SCOPE_SUBTREE,
"sAMAccountName=%s" % username,
ad_settings.AD_SEARCH_FIELDS)[0][1]
con.unbind()
except ldap.LDAPError:
return None
# Does user belong to appropriate AD group?
if not anyof(ad_settings.PROJECTCODE,ADUser):
return None
# Does user already exist in Django?
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
#create Django user
user = User(username=username, is_staff = True, is_superuser = False)
#Update User info from AD
if ADUser.has_key('givenName'):
user.first_name = ADUser.get('givenName')[0]
if ADUser.has_key('sn'):
user.last_name = ADUser.get('sn')[0]
if ADUser.has_key('mail'):
user.email = ADUser.get('mail')[0]
# Does not store password in Django.
user.set_unusable_password()
user.save()
return user
EDIT: Herausgefunden. Benutzer können sich nur anmelden, wenn sie aktiv sind (obwohl dies in der Dokumentation nicht angegeben ist). Daher sollte in dem angegebenen Code die Zeile, die den neuen Benutzer erstellt, folgendermaßen aussehen:
user = User(username=username, is_staff = True, is_Active = True,
is_superuser = False)