LdapUsers — Plugin LDAP para FacturaScripts
Desarrollado por Basal-AI Solutions S.L.
Plugin para FacturaScripts 2025.81+ que permite autenticar usuarios contra un servidor LDAP (FreeIPA, Active Directory, OpenLDAP) y controlar el acceso y permisos mediante grupos LDAP.
Requisitos
- FacturaScripts 2025.81 o superior.
- PHP 8.1+ con la extensión php-ldap instalada.
En Ubuntu/Debian:
apt install php8.3-ldap
systemctl restart php8.3-fpm
Instalación
- Descargar
LdapUsers.zip. - En FacturaScripts ir a Admin → Plugins.
- Pulsar Subir plugin y seleccionar el archivo
LdapUsers.zip. - Activar el plugin LdapUsers.
Tras activar aparecerá un nuevo menú: Admin → Configuración LDAP.
Configuración
1. Servidor LDAP
| Campo | Descripción | Ejemplo |
|---|---|---|
| Host | Hostname o IP del servidor LDAP | ldap.empresa.com |
| Tipo de conexión | Sin cifrar, SSL (LDAPS) o STARTTLS | SSL / LDAPS (puerto 636) |
| Puerto | Se rellena automáticamente al elegir tipo de conexión. Se puede cambiar manualmente | 636 |
Nota: SSL y STARTTLS son mutuamente excluyentes. SSL cifra toda la conexión desde el inicio (puerto 636). STARTTLS negocia el cifrado sobre una conexión plana (puerto 389).
2. Búsqueda de usuarios
| Campo | Descripción | Ejemplo FreeIPA | Ejemplo Active Directory |
|---|---|---|---|
| Base DN | DN donde buscar usuarios | cn=users,cn=accounts,dc=empresa,dc=com |
OU=Users,DC=empresa,DC=com |
| Atributo de usuario | Atributo LDAP que contiene el nombre de login | uid |
sAMAccountName |
3. Filtro por grupos
Permite restringir el acceso a miembros de determinados grupos LDAP y asignar automáticamente el nivel admin/usuario según la pertenencia a grupo.
| Campo | Descripción | Ejemplo |
|---|---|---|
| DN base de grupos | DN donde residen los grupos | cn=groups,cn=accounts,dc=empresa,dc=com |
| Grupos de administradores | CNs de grupos cuyos miembros serán admin en FacturaScripts (separar con coma) | fs-admins, sysadmins |
| Grupos de usuarios | CNs de grupos cuyos miembros tendrán acceso normal sin admin (separar con coma) | fs-users, contabilidad |
Reglas de acceso:
- Si el usuario pertenece a cualquiera de los grupos admin → cuenta local con
admin = true. - Si no es admin pero pertenece a cualquiera de los grupos de usuarios → cuenta local con
admin = false. - Si no pertenece a ningún grupo autorizado → acceso denegado.
- Si ambos campos de grupo están vacíos → cualquier usuario LDAP autenticado tiene acceso (sin filtro).
El nivel admin se sincroniza en cada login. Si un usuario es eliminado del grupo admin en LDAP, perderá los permisos de administrador la próxima vez que inicie sesión.
4. Cuenta de servicio (bind)
| Campo | Descripción | Ejemplo |
|---|---|---|
| DN de la cuenta de servicio | DN de una cuenta de solo lectura para buscar usuarios en el directorio | uid=svc-facturascripts,cn=sysaccounts,cn=etc,dc=empresa,dc=com |
| Contraseña | Contraseña de la cuenta de servicio. Al dejarla en blanco se conserva la ya guardada | — |
Si el servidor permite búsquedas anónimas (como FreeIPA por defecto), se pueden dejar ambos campos vacíos.
Diagnóstico
La sección Diagnóstico aparece en la parte inferior de la página de configuración una vez se ha guardado un host. Ofrece dos herramientas:
Probar conexión
Comprueba que el servidor LDAP es accesible con la configuración guardada y que el bind de servicio funciona correctamente.
Probar usuario
Permite introducir un nombre de usuario (y opcionalmente una contraseña) para verificar paso a paso:
- Si el usuario existe en el directorio LDAP y cuál es su DN.
- Su email (atributo
mail). - Todos los grupos a los que pertenece (atributo
memberOf). - Si encaja con alguno de los grupos configurados como admin o usuario, y qué resultado tendría (admin, acceso normal, o acceso denegado).
- Si la contraseña es correcta (solo cuando se proporciona).
Esta herramienta no crea ni modifica ninguna cuenta local. Solo realiza consultas de lectura contra el LDAP.
Flujo de autenticación
Cuando un usuario introduce sus credenciales en la pantalla de login de FacturaScripts:
¿LDAP configurado?
│
sí ────┤──── no
│ │
Buscar en LDAP Auth local FS
│
¿Usuario existe?
│
sí ────┤──── no
│ │
Verificar pass Auth local FS
│
¿Pass correcta?
│
sí ──┤── no
│ │
¿Filtro DENEGADO
grupos? (sin fallback)
│
sí ──┤── no
│ │
¿En grupo Acceso
válido? (admin=false)
│
sí ──┤── no
│ │
Acceso DENEGADO
(admin según grupo)
Puntos clave:
- Si el usuario existe en LDAP pero la contraseña es incorrecta, el acceso se deniega sin intentar autenticación local. Esto evita que un usuario local con la misma contraseña antigua pueda entrar si cambia su contraseña en LDAP.
- Si el usuario no existe en LDAP, se intenta la autenticación local normal de FacturaScripts (para el usuario
admininicial u otros usuarios creados manualmente). - En el primer login LDAP exitoso de un usuario nuevo, se crea automáticamente su cuenta local con una contraseña aleatoria (inutilizable) y el email obtenido del LDAP.
- En cada login sucesivo, se sincronizan el email y el nivel admin según los grupos LDAP actuales.
Ejemplo completo: FreeIPA
Host: ipa.empresa.com
Tipo de conexión: SSL / LDAPS (puerto 636)
Puerto: 636
Base DN: cn=users,cn=accounts,dc=empresa,dc=com
Atributo de usuario: uid
DN base de grupos: cn=groups,cn=accounts,dc=empresa,dc=com
Grupos admin: fs-admins, sysadmins
Grupos usuarios: fs-users, contabilidad
DN cuenta servicio: uid=svc-facturascripts,cn=sysaccounts,cn=etc,dc=empresa,dc=com
Contraseña: ********
Ejemplo completo: Active Directory
Host: dc01.empresa.local
Tipo de conexión: SSL / LDAPS (puerto 636)
Puerto: 636
Base DN: OU=Users,DC=empresa,DC=local
Atributo de usuario: sAMAccountName
DN base de grupos: OU=Groups,DC=empresa,DC=local
Grupos admin: Domain Admins, FS-Admins
Grupos usuarios: FS-Users, Contabilidad
DN cuenta servicio: CN=svc-facturascripts,OU=Service Accounts,DC=empresa,DC=local
Contraseña: ********
Resolución de problemas
| Problema | Causa probable | Solución |
|---|---|---|
| "Se requiere la extensión ldap" al activar | php-ldap no instalado |
apt install php8.3-ldap && systemctl restart php8.3-fpm |
| Timeout (504) al probar conexión | Host o puerto incorrectos, o firewall bloqueando | Verificar conectividad: ldapsearch -x -H ldaps://host:636 -b "" -s base |
| Error STARTTLS | Certificado del servidor no confiable | Instalar la CA del servidor LDAP en el almacén de certificados del sistema: copiar el .crt a /usr/local/share/ca-certificates/ y ejecutar update-ca-certificates |
| Error bind cuenta de servicio | DN o contraseña incorrectos | Verificar con: ldapwhoami -x -H ldaps://host -D "DN" -W |
| Usuario no encontrado | Base DN o atributo de usuario incorrectos | Usar el test de usuario en Diagnóstico para verificar |
| Acceso denegado (grupos) | El usuario no es miembro de ningún grupo configurado | Usar el test de usuario para ver sus memberOf y compararlos con los grupos configurados |
| El usuario pierde admin al hacer login | Ha sido eliminado del grupo admin en LDAP | Comportamiento esperado: los permisos se sincronizan en cada login |
Licencia
LGPL-3.0-or-later