Autenticando contra un LDAP desde Python

Desde hace ya algún tiempo soy un lector asiduo de los blogs de Zuzel, Yasser, Luis y otros muchachos de la UH, que poseen su blog. Realmente son algunos de los escasos blogs que existen en Cuba que se actualicen y que además publican contenidos que me resulten interesantes :-).

En fin gracias a un trabajo que presentó Zuzel en la Jornada Científica en la Universidad de la Habana llegúe al DrProject, que según su propia web:

DrProject is a web-based project management portal that integrates revision control, issue tracking, mailing lists, a wiki, and other tools that software development teams need to succeed. DrProject was designed to be simple enough for undergraduate students to master in less than an hour, and is now being used by universities, open source projects, and commercial teams in several companies.

Me pareció bastante interesante y además mucho más sencillo que otros como el GForge, además el atribuido adicional de tener a una experta cerca era tentadora. Pues nada me puse en contacto con ella y como para ella no era ningún problema el venir hasta la Universidad, ayudarme a instalar y configurar, pues asi lo hicimos. Luego de luchar con algunas “p” mal escritas :-), se logró hacer funcionar todo sin mayores problemas.

De todo el proceso, la parte que más le interesaba a Zuzel era la de hacer autenticar al drproject contra el LDAP de la Universidad, luego de escribir algún que otro código lo dejamos con una autentificación, que en ese momento, pensé que funcionaba, la cuestión fue que al final, luego de probar varias veces llegué a la conclusión de que realmente no funcionaba, pues cualquier combinación de usuario / contraseña que le proporcionaba se logeaba perfectamente.

Entonces fue cuando comenzé a buscar información sobre la librería python-ldap que estábamos utilizando para la autentificación, luego de una búsqueda bastante amplia, no encontré ninguna información que me fuera del todo clara o que me proporcionara algún ejemplo que me permitiera adaptarlo de forma rápida y fácil a mis necesidades. Finalmente, pude encontrar en estos artículos la mejor información disponible, y aquí un ejemplo que aunque orientado a django me fue muy útil para lograr un script funcional. A continuación dejo el código del fichero validate.py que se encarga de realizar la autentificación desde la interfaz web del DrProject:

Expliquemos un poco el código:

AD_DNS_NAME = 'uci.cu'
AD_LDAP_PORT = 389
AD_SEARCH_DN = 'OU=UCI Domain Users,DC=uci,DC=cu'
AD_SEARCH_FIELDS = ['displayname', 'mail', 'mailnickname', 'title']
AD_LDAP_URL = 'ldap://%s:%s' % (AD_DNS_NAME, AD_LDAP_PORT)
DOMAIN = "uci.cu"

Estas líneas son simplemente de configuración para establecer el AD_LDAP_URL que es la URL que se utiliza para conectar al servidor LDAP.


username = sys.stdin.readline().strip("\n")
password = sys.stdin.readline().strip("\n")
try:
l = ldap.initialize(AD_LDAP_URL)
r = l.simple_bind_s("%s@%s"%(username, DOMAIN), password)
l.unbind_s()
sys.exit(0)
except ldap.LDAPError, e:
# print e.message['info']
if type(e.message) == dict and e.message.has_key('desc'):
print e.message['desc']
else:
print e
sys.exit(1)

Esta es la función validate que es la que encarga de corroborar las credenciales del usuario. En el caso particular de DrProject se leen el usuario y la contraseña mediante la entrada estándard y luego se comprueban con el servidor LDAP.

Finalmente lo que se incluye es una llamada a la función validate para ejecutarla:


if __name__ == '__main__': validate()

De esta forma se logra que el DrProject autentique directamente contra un servidor LDAP, lo cual puede ser útil debido a que la gestión de usuarios no queda de parte del DrProject y además se evita que los usuarios tengan que crearse nuevas cuentas y recordar más contraseñas 🙂

5 thoughts on “Autenticando contra un LDAP desde Python

    1. Jorge Luis, soy estudiante de la uci y estoy trabajando en mi tesis con django, hay un momento en tu blog que hacer referencia a unos articulos que te ayudaron, pero no me deja conectarme, la razón por la que te escribo es para ver si me podias ayudar, resolviendome los articulos de los que hablabas, si puedes escribme un coreo mi usuario es maremon

  1. Hola: gracias por tu aporte, la duda que tengo es donde pones el siguiente codigo al que haces mencion

    if __name__ == ‘__main__’: validate()

    1. Hola Carolina, la definición de la función validate() es el fragmento de código que se muestra anterior, fíjate que en el párrafo después de sys.exit(1) se menciona. Básicamente tienes que englobar todo desde username, hasta sys.exit(1) en una función validate() y esta se llama luego en caso de que el script se ejecute, la otra forma es simplemente obviar esa línea que mencionas y copiarlo todo a un fichero validate.py

  2. Hola a todos, estoy tratando de integrar mi aplicacion que esta hecha con el CMS Django a un Ldap y no se quiere conectar al servidor Ldap, ya configure el setting.py como lo trae en la documentacion oficial del django y aun asi no se conecta, ya he investigado en todas las bibliografias y todas dicen los mismo, y buscando encontre este sitio donde se habla sobre eso, y necesito ayuda, no se que hacer, me pueden escribir a mi correo, saludos

Leave a comment