query create python ldap bind ldap-query

create - Módulo LDAP de Python: ¿debo ejecutar siempre "whoami_s()" para autenticar con éxito?



python openldap create user (2)

Afortunadamente este código es solo para pruebas, y es lo suficientemente corto como para copiarlo / pegarlo aquí en su totalidad. Básicamente, debo vincularme a un dn para obtener los detalles específicos de mi búsqueda. De lo contrario, si no está vinculado, se vincula de forma anónima y luego solo puedo obtener la información de los barebones. Parece que no puedo enlazar correctamente a menos que ejecute explícitamente whoami_s () después de enlazar.

Código que no funciona (se vincula anónimamente):

l = ldap.initialize("ldap://myldapserver") l.simple_bind("cn=test,ou=profile,dc=site,dc=com", "abc123") basedn = "ou=people,dc=site,dc=com" filter = "uid=bob" results = l.search_st(basedn, ldap.SCOPE_SUBTREE, filter) for entry in results: print entry

Código que funciona (enlaza con éxito y proporciona todos los detalles posibles):

l = ldap.initialize("ldap://myldapserver") l.simple_bind("cn=test,ou=profile,dc=site,dc=com", "abc123") l.whoami_s() ### <---- This is the only difference ### basedn = "ou=people,dc=site,dc=com" filter = "uid=bob" results = l.search_st(basedn, ldap.SCOPE_SUBTREE, filter) for entry in results: print entry

Encuentro que falta bastante la documentación del módulo LDAP (por ejemplo, no encuentro nada que detalle las diferencias exactas entre bind, bind_s, simple_bind y simple_bind_s, pero esa es una pregunta para otro día). No puedo encontrar nada que diga explícitamente que necesitas finalizar el enlace con whoami_s () o cualquier cosa. ¿Debería simplemente aceptarlo, o debería estar preocupado?

Python: 2.6.9 LDAP module: 2.4.13


Esto es raro. En el caso más simple, un cliente debe:

  • Conéctate al servidor.
  • Si la conexión es exitosa, cambie el estado de autorización de la conexión según se requiera con la solicitud BIND (de la cual hay dos tipos, simple y SASL).
  • Si el BIND fue exitoso, transmita otras solicitudes LDAP, por ejemplo, search , compare , modify , modify DN , etc. interpretar las respuestas del servidor a medida que llegan. Los clientes LDAPv3 también pueden BIND de nuevo, lo que cambiará el estado de autorización de la conexión.

No sé lo que hace whoami_s (aunque hay una operación extendida de LDAP llamada WHO AM I), pero no sería necesario. A primera vista, el primer ejemplo de código debería funcionar. Suponiendo que la conexión funciona y BIND tuvo éxito, eso es todo lo que se requiere. Si hay más que eso, entonces la API está rota.

Realmente no es una respuesta, lo siento.

ver también


Entendí esto solo por prueba y error. En primer lugar, después de realizar más búsquedas, encontré un sitio que establece explícitamente las diferencias entre bind, bind_s, simple_bind y simple_bind_s: http://www.packtpub.com/article/installing-and-configuring-the-python-ldap -library-y-binding-to-an-ldap-directory

Los métodos sin la "s" al final son asincrónicos: el código continúa con la finalización o no de la operación. Los métodos con la "s" al final son sincrónicos: el código se detiene y espera a que se complete la operación.

Entonces, lo que estaba enfrentando aquí era una especie de condición de carrera. Puse un "time.sleep (1)" en lugar del "whoami_s ()", y eso resolvió el problema. Esto me llevó a darme cuenta de que necesitaba cambiar de "simple_bind" a "simple_bind_s". Estaba llegando al código de consulta de LDAP demasiado rápido, antes de que estuviera correctamente enlazado, por lo que se estaba ejecutando de forma anónima.