Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf-8
- import ldap
- from django.conf import settings
- from django.contrib.auth.models import User
- from django.contrib.auth.backends import ModelBackend
- import logging, sys
- logger = logging.getLogger(__name__)
- ldap_server = ldap.open(settings.LDAP_HOST)
- ldap_server.ldap_version = ldap.VERSION3
- class LDAPAuthBackend(ModelBackend):
- extra_dn = ''
- __my_dn = settings.LDAP_BASE_DN
- def authenticate(self,username=None,password=None,**kwargs):
- logger.info('Nous sommes au début de authenticate')
- try:
- if len(password) == 0:
- logger.info('Mot de passe vide')
- return None
- if len(username) == 0:
- logger.info('Username vide')
- return None
- for name in kwargs.items(): #On boucle sur les arguments nommés supplémentaires
- if name == 'extra_dn':
- logger.info('Nous avons un extra_dn')
- self.extra_dn = kwargs['extra_dn']
- break
- if self.extra_dn != '':
- self.__my_dn = ','.join([self.extra_dn,settings.LDAP_BASE_DN])
- else:
- self.extra = settings.LDAP_BASE_DN
- logger.info('Notre DN est du coup : <'+self.__my_dn+'>')
- #On vérifie que l'utilisateur existe
- searchScope = ldap.SCOPE_SUBTREE
- retrieveAttributes = None
- searchFilter = settings.LDAP_SEARCH_FILTER.format(username=username)
- logger.info('Le filtre de la recherche : <' + searchFilter + '>')
- logger.info('self.__my_dn : ' + self.__my_dn)
- try:
- logger.info('Try de recherche')
- ldap_result_id = ldap_server.search(self.__my_dn, searchScope, searchFilter, retrieveAttributes)
- result_set = []
- while 1 :
- logger.info('while 1')
- result_type, result_data = ldap_server.result(ldap_result_id,0)
- if (result_data == []):
- logger.info('data est vide ! on sort')
- break
- else:
- if result_type == ldap.RES_SEARCH_ENTRY:
- result_set.append(result_data)
- logger.info('ajout de data au set')
- logger.info(len(result_set))
- if len(result_set) != 1:
- logger.error('Argh ! Il y a <' + len(result_set) + '> réponses retournées :/')
- #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
- return None
- logger.info('On a bien trouvé une valeur :' + result_set)
- except:
- logger.error('Une erreur dans la recherche :' + sys.exc_info())
- return None
- #login = ','.join([settings.LDAP_LOGIN.format(username=username),self.__my_dn])
- login = result_set[0][0]
- logger.info('>>> ' + login + ' <<<')
- logger.info('Notre DN pour le login : <' + login + '>')
- ldap_bind = ldap_server.simple_bind(ldap_server, login, password)
- logger.info('ldap_bind:' + ldap_bind)
- with ldap_bind:
- try:
- user = User.objects.get(username=username)
- logger.info(user.uid)
- user.set_password(password)
- user.is_active=True
- user.is_staff=True
- #ldap_server.close()
- return user
- except:
- logger.error("La création du User a foiré : " + sys.exc_info())
- return None
- except:
- logger.error("On n'a même pas passé le 1er try: " + sys.exc_info())
- #ldap_server.close()
- return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement