2009-07-09 9 views
9

Je rencontre un problème avec un backend d'authentification personnalisé que j'ai créé pour un annuaire Active Directory via l'authentification LDAP. Le problème est que depuis la page de connexion de l'administrateur, après qu'il authentifie correctement et crée le nouvel utilisateur dans la base de données (ou met à jour ses informations du serveur LDAP), mais me renvoie à la page de connexion admin indiquant que j'ai échoué pour entrer un nom d'utilisateur et un mot de passe valides. Considérant qu'il s'authentifie et crée/met à jour l'utilisateur dans la base de données django, qu'est-ce que je fais de mal?Problème avec le backend d'authentification personnalisé pour Django

Le 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: cernées. Les utilisateurs ne peuvent pas se connecter à moins qu'ils ne soient actifs (même si la documentation ne le dit pas). Par conséquent, dans le code donné, la ligne qui crée le nouvel utilisateur doit ressembler à:

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

Je cherchais cela, parce que j'ai besoin d'écrire des choses similaires. Merci de poster ceci :-) – gruszczy

+0

Avez-vous envisagé d'utiliser mod_ldap et RemoteUserMiddleware? – davidfischer

+0

Vous devriez mettre votre modification dans une question et la marquer comme réponse afin que cette question soit «répondue». –

Répondre

3

À définir. Les utilisateurs ne peuvent pas se connecter à moins qu'ils ne soient actifs (même si la documentation ne le dit pas). Par conséquent, dans le code donné, la ligne qui crée le nouvel utilisateur devrait ressembler à:

user = User(username=username, is_staff = True, is_Active = True, 
       is_superuser = False) 
Questions connexes