Advertisement
SntPx

ldapBackend

Jul 13th, 2014
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.93 KB | None | 0 0
  1. # coding: utf-8
  2.  
  3. import ldap
  4. from django.conf import settings
  5. from django.contrib.auth.models import User
  6. from django.contrib.auth.backends import ModelBackend
  7. import logging, sys
  8.  
  9. logger = logging.getLogger(__name__)
  10.  
  11. ldap_server = ldap.open(settings.LDAP_HOST)
  12. ldap_server.ldap_version = ldap.VERSION3
  13.  
  14. class LDAPAuthBackend(ModelBackend):
  15.    
  16.     extra_dn = ''
  17.     __my_dn = settings.LDAP_BASE_DN
  18.    
  19.     def authenticate(self,username=None,password=None,**kwargs):
  20.         logger.info('Nous sommes au début de authenticate')
  21.         try:
  22.             if len(password) == 0:
  23.                 logger.info('Mot de passe vide')
  24.                 return None
  25.             if len(username) == 0:
  26.                 logger.info('Username vide')
  27.                 return None
  28.             for name in kwargs.items(): #On boucle sur les arguments nommés supplémentaires
  29.                 if name == 'extra_dn':
  30.                     logger.info('Nous avons un extra_dn')
  31.                     self.extra_dn = kwargs['extra_dn']
  32.                     break
  33.             if self.extra_dn != '':
  34.                 self.__my_dn = ','.join([self.extra_dn,settings.LDAP_BASE_DN])
  35.             else:
  36.                 self.extra = settings.LDAP_BASE_DN
  37.             logger.info('Notre DN est du coup : <'+self.__my_dn+'>')
  38.            
  39.             #On vérifie que l'utilisateur existe
  40.             searchScope = ldap.SCOPE_SUBTREE
  41.             retrieveAttributes = None
  42.             searchFilter = settings.LDAP_SEARCH_FILTER.format(username=username)
  43.             logger.info('Le filtre de la recherche : <' + searchFilter + '>')
  44.             logger.info('self.__my_dn : ' + self.__my_dn)
  45.             try:
  46.                 logger.info('Try de recherche')
  47.                 ldap_result_id = ldap_server.search(self.__my_dn, searchScope, searchFilter, retrieveAttributes)
  48.                 result_set = []
  49.                 while 1 :
  50.                     logger.info('while 1')
  51.                     result_type, result_data = ldap_server.result(ldap_result_id,0)
  52.                     if (result_data == []):
  53.                         logger.info('data est vide ! on sort')
  54.                         break
  55.                     else:
  56.                         if result_type == ldap.RES_SEARCH_ENTRY:
  57.                             result_set.append(result_data)
  58.                             logger.info('ajout de data au set')
  59.                
  60.                 logger.info(len(result_set))
  61.                 if len(result_set) != 1:
  62.                     logger.error('Argh ! Il y a <' + len(result_set) + '> réponses retournées :/')
  63.                     #Il existe plus d'une entrée ou pas d'entrée du tout pour le pseudo rechercéh : anormal, mais ne levons pas d'exception
  64.                     return None
  65.                
  66.                 logger.info('On a bien trouvé une valeur :' + result_set)
  67.            
  68.             except:
  69.                 logger.error('Une erreur dans la recherche :' + sys.exc_info())
  70.                 return None
  71.            
  72.             #login = ','.join([settings.LDAP_LOGIN.format(username=username),self.__my_dn])
  73.             login = result_set[0][0]
  74.             logger.info('>>> ' + login + ' <<<')
  75.             logger.info('Notre DN pour le login : <' + login + '>')
  76.             ldap_bind = ldap_server.simple_bind(ldap_server, login, password)
  77.             logger.info('ldap_bind:' + ldap_bind)
  78.             with ldap_bind:
  79.                 try:
  80.                     user = User.objects.get(username=username)
  81.                     logger.info(user.uid)
  82.                     user.set_password(password)
  83.                     user.is_active=True
  84.                     user.is_staff=True
  85.                     #ldap_server.close()
  86.                     return user
  87.                 except:
  88.                     logger.error("La création du User a foiré : " + sys.exc_info())
  89.                     return None
  90.         except:
  91.             logger.error("On n'a même pas passé le 1er try: " + sys.exc_info())
  92.             #ldap_server.close()
  93.             return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement