Sto riscontrando un problema con un backend di autenticazione personalizzato che ho creato per un Active Directory tramite l'autenticazione LDAP.Problema con il backend di autenticazione personalizzato per Django
Il problema è che dalla pagina di accesso dell'amministratore, dopo aver correttamente autenticato e creato il nuovo utente nel database (o aggiorna le informazioni dal server LDAP), ma poi ritorna alla pagina di accesso dell'amministratore indicando che non sono riuscito inserire un nome utente e una password validi.
Considerando che autentica e crea/aggiorna l'utente nel database django, cosa sto facendo male?
Il codice:
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: capito. Gli utenti non possono accedere a meno che non siano attivi (anche se la documentazione non lo dice). Pertanto, nel codice fornito, la riga che crea il nuovo utente dovrebbe essere simile a:
user = User(username=username, is_staff = True, is_Active = True,
is_superuser = False)
Stavo cercando questo, perché ho bisogno di scrivere cose simili. Grazie per aver postato questo :-) – gruszczy
Hai mai pensato di utilizzare mod_ldap e RemoteUserMiddleware? – davidfischer
Dovresti inserire la tua modifica in una domanda e contrassegnarla come risposta in modo che questa domanda diventi 'risposta'. –