2009-07-09 11 views
9

Mam problem z niestandardowym zapleczem uwierzytelniania, które stworzyłem dla usługi Active Directory za pośrednictwem uwierzytelniania LDAP.Problem z niestandardowym zapleczem uwierzytelniania dla Django

Problem polega na tym, że na stronie logowania administratora, po prawidłowym uwierzytelnieniu i utworzeniu nowego użytkownika w bazie danych (lub aktualizacji ich informacji z serwera LDAP), a następnie zwraca mnie do strony logowania administratora, wskazując, że nie udało mi się wprowadzić prawidłową nazwę użytkownika i hasło.

Biorąc pod uwagę, że uwierzytelnia się i tworzy/aktualizuje użytkownika w bazie danych Django, co robię źle?

Kod:

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: zorientowali się. Użytkownicy nie mogą się zalogować, chyba że są aktywni (mimo że dokumentacja tego nie mówi). Dlatego w podanym kodzie linia tworząca nowego użytkownika powinna wyglądać następująco:

 user = User(username=username, is_staff = True, is_Active = True, 
        is_superuser = False) 
+0

Szukałem tego, ponieważ muszę pisać podobne rzeczy. Dzięki za umieszczenie tego :-) – gruszczy

+0

Czy rozważałeś użycie mod_ldap i RemoteUserMiddleware? – davidfischer

+0

Powinieneś umieścić swoją odpowiedź w pytaniu i oznaczyć ją jako odpowiedź, aby to pytanie zostało "odebrane". –

Odpowiedz

3

Wykreślono. Użytkownicy nie mogą się zalogować, chyba że są aktywni (mimo że dokumentacja tego nie mówi). Dlatego w podanym kodzie linia tworząca nowego użytkownika powinna wyglądać następująco:

user = User(username=username, is_staff = True, is_Active = True, 
       is_superuser = False) 
Powiązane problemy