Conectando odoo con un directorio LDAP …

… se sufre lo suyo, pero termina por funcionar.

La idea no es nueva. Tenemos un directorio de usuarios central con el que se identifican en la red de la empresa. Tenemos un ERP moderno y cuqui y queremos (quiero, más bien) que para acceder a él los usuarios empleen la misma contraseña que en el resto de los equipos y aplicaciones.

El directorio de usuarios funciona con openLDAP, el ERP es odoo, y existe un complemento para éste que permite que, dentro de una empresa en concreto (puede gestionar varias), los usuarios se tengan que validar con el citado directorio.

El principal escollo que me he encontrado es justamente cómo funciona el invento:

  1. Utiliza la dirección de correo en lugar del identificador de usuario (esto es cosa de odoo, que tomaron la decisión de emplear el correo como identificador).
  2. Valida primero contra la base de datos interna si tiene definida una contraseña.
  3. Intenta conectar con el directorio LDAP como último recurso.
  4. odoo no permite anular una contraseña desde la aplicación. Cambiarla sí, pero no anularla.

Con cualquier cuenta nueva no hay problema. Se asegura uno de que la dirección de correo corresponda con la que hay en el directorio LDAP y se olvida de asignarle contraseña. odoo no almacenará esa información si la validación externa tiene éxito. Eso que ganamos.

¿ Y qué hacemos con los usuarios que ya existen ? Pues ir por las bravas. Conectar a muy bajo nivel con la base de datos, localizar la tabla correspondiente y anular el valor de la columna de la contraseña. Entonces sí, entonces odoo se olvidará de verificar en sus tablas y pasará a hacerlo únicamente con el complemento LDAP.

Anular contraseñas por las bravas

Asumiendo que la base de datos se llama test_cce_ldap el proceso es el siguiente:

$ sudo -u postgres psql postgres
psql (9.5.4, server 9.5.5)
Type "help" for help.

postgres=# \c test_cce_ldap
psql (9.5.4, server 9.5.5)
You are now connected to database "test_cce_ldap" as user "postgres".
test_cce_ldap=# update res_users set password_crypt = null where login = 'xxxx@ejemplo.net?;
UPDATE 1
test_cce_ldap=# 

En el paso a producción será necesario hacerlo con todos los usuarios que tengan algo en la columna pasword_crypt, para que a partir de ese momento tengan que acreditarse con sus credenciales habituales.

Configurar el complemento LDAP en odoo

Para definir los parámetros del módulo se debe acceder a la ficha de la compañía y editar la pestaña de configuración. Admite varios directorios LDAP y aunque en la documentación no dice nada sobre el orden de consulta asumo que el campo Secuencia tendrá algo que ver.

Si el directorio LDAP lo permite se puede hacer conexiones bind directas según lo que el usuario proporcione. Las credenciales binddn son para que compruebe que el usuario exista antes de intentar validar su contraseña. Algo que puede venir bien en ciertos entornos pero que en mi caso me es indiferente.

El filtro LDAP está buscando exactamente por el campo mail. He intentado forzarlo para que comprobase únicamente con el campo uid pero parece que me he pasado de listo y si no es un correo como que no.

También dispone de la opción de crear usuarios automáticamente cuando validan correctamente contra el directorio LDAP, con la oportunidad de crearles un perfil determinado de usuario pero he desechado la idea casi de inmediato. Como tengo otros usuarios de sistema dados de alta en el directorio tendría que complicar más el filtro de búsqueda para excluirlos.

Por ahora todo bien …