2016-11-28 1 views
0

Je le code suivantméthode Python LDAP3 rebind ne soulève pas d'erreur

from ldap3 import Server, Connection, SUBTREE, ALL_ATTRIBUTES, LDAPBindError 

... 
... 

def search(self, id): 
    if not self._connect.bind(): 
     print('error in bind', self._connect.result) 
    else: 
     self._connect.search(
      search_base=self._base_dn, 
      search_filter='(uid='+id+')', 
      search_scope=SUBTREE 
     ) 
     userdn = self._connect.response[0]['dn'] 
     try: 
      self._connect.rebind(user=userdn, password='password') 
      print(self._connect.result) 
     except LDAPBindError: 
      print('error in rebind', self._connect.result) 

     self._connect.unbind() 
    pass 

Selon python-ldap3 documentation la méthode rebind devrait soulever une LDAPBindError

Docs:

# import class and constants 
from ldap3 import Server, Connection, ALL, LDAPBindError 

# define the server 
s = Server('servername', get_info=ALL) # define an unsecure LDAP server, requesting info on DSE and schema 

# define the connection 
c = Connection(s, user='user_dn', password='user_password') 

# perform the Bind operation 
if not c.bind(): 
    print('error in bind', c.result) 

try: 
    c.rebind(user='different_user_dn', password='different_user_password') 
except LDAPBindError: 
    print('error in rebind', c.result) 

Dans le cas où les informations d'identification ne sont pas valides ou si le serveur ne vous autorise pas à rver pourrait brusquement fermer la connexion. Cette condition est vérifiée par la méthode rebind() et une exception LDAPBindError sera levée si caugh. Link to this

Le problème est que, bien que tout semble fonctionner très bien, je peux vérifier que l'impression de la propriété result.

Sur succeful retirage: {'result': 0, 'description': 'success', 'type': 'bindResponse', 'message': '', 'dn': '', 'referrals': None, 'saslCreds': None}

Sur retirage a échoué: {'type': 'bindResponse', 'dn': '', 'result': 49, 'description': 'invalidCredentials', 'message': '', 'referrals': None, 'saslCreds': None}

Bien que pas REBIND aucune exception est levée. Ai-je compris quelque chose de mal et ne devrait pas faire d'erreur? Sinon, pourquoi cela n'a-t-il pas tort?

Merci pour toute aide.

Répondre

2

Les documents sont obsolètes. La méthode rebind() se comporte comme bind(). Il renvoie True si bind est réussi et false s'il échoue. Si vous souhaitez qu'une exception soit déclenchée lorsque les informations d'identification ne sont pas valides, vous devez utiliser le paramètre raise_exceptions = True dans la définition Connection().

L'exception LdapBindError est déclenchée uniquement si le serveur ferme la connexion lors d'une nouvelle tentative de liaison. Gardez à l'esprit que les erreurs réseau déclenchent toujours une exception, même si raise_exceptions est défini sur False.

mettra à jour les docs bientôt (je suis l'auteur de ldap3).