Ir al contenido
Otras versiones

Cargando…

Resolución de problemas de LDAP

Si ve una excepción como esta “org.springframework.context.ApplicationContextException: No UserDetailsService registered”, puede añadir esta línea en su OpenKM.xml:

<beans:bean id="userDetailService" class="com.openkm.spring.UserTenantDetailsService"/>

Si ve una excepción como esta “javax.naming.PartialResultException”, probablemente no pueda utilizar la configuración básica de Active Directory.

Solución 1:

Utilice el puerto 3268 o 3269 en la conexión con el AD.

Vaya a Administration > Configuration parameters:

Campo / Propiedad Tipo Descripción
principal.ldap.server String ldap://192.168.xxx.xxx:3268

Solución 2:

Habilite la propiedad de referral de ldap.

Vaya a Administration > Configuration parameters:

Campo / Propiedad Tipo Descripción
principal.ldap.referral String follow

Lea estos artículos:

Si su servidor LDAP está configurado con SSL, debe utilizar ldaps://

Solución:

Vaya a Administration > Configuration parameters:

Cambie la URL de conexión del servidor a ldaps.

Campo / Propiedad Tipo Descripción
principal.ldap.server String ldaps://192.168.0.6:389

Inicio de sesión lento o imposibilidad de iniciar sesión

Sección titulada «Inicio de sesión lento o imposibilidad de iniciar sesión»

Puede tratarse de un problema con la resolución de nombres DNS de LDAP.

Solución:

Para evitar este problema - especialmente en la familia de sistemas operativos Windows - es una buena práctica añadir todos los subdominios en el archivo hosts del servidor de aplicaciones (/etc/hosts en linux o C:/Windows/system32/driver/etc/host en windows).

Ejemplo basado en active directory (LDAP) con nombre base distinguido dc=company,dc=com y servidor con nombre de servidor de dominio SBSSERVER.

10.10.1.2 company.com
10.10.1.2 SBSSERVER SBSSERVER.company.com
10.10.1.2 Schema.Configuration.company.com
10.10.1.2 Configuration.company.com
10.10.1.2 DomainDnsZones.company.com
10.10.1.2 ForestDnsZones.company.com

Más información en el foro de OpenKM.

Forzar que todos los usuarios sean miembros de ROLE_USER

Sección titulada «Forzar que todos los usuarios sean miembros de ROLE_USER»

En repositorios de AD con un gran número de usuarios, puede no ser práctico para el administrador del AD añadir un nuevo grupo a todos los usuarios; en este caso podemos forzar, mediante la configuración xml de inicio de sesión, que cualquier usuario autenticado sea miembro de ROLE_USER. Debe añadirse la etiqueta xml <beans:property name=“defaultRole” value=“ROLE_USER” />.

Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="ldapAuthProvider" />
</security:authentication-manager>
<beans:bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<beans:constructor-arg value="ldap://192.168.xxx.xxx"/>
<beans:property name="userDn" value="CN=connect,OU=OpenKM,DC=company,DC=com"/>
<beans:property name="password" value="****"/>
<beans:property name="baseEnvironmentProperties">
<beans:map>
<beans:entry>
<beans:key>
<beans:value>java.naming.referral</beans:value>
</beans:key>
<beans:value>follow</beans:value>
</beans:entry>
</beans:map>
</beans:property>
</beans:bean>
<beans:bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<beans:constructor-arg>
<beans:bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
<beans:constructor-arg ref="contextSource"/>
<beans:property name="userSearch" ref="userSearch"/>
</beans:bean>
</beans:constructor-arg>
<beans:constructor-arg name="authoritiesPopulator" ref="defaultLdapAuthoritiesPopulator"/>
</beans:bean>
<beans:bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<beans:constructor-arg index="0" value="DC=company,DC=com" />
<beans:constructor-arg index="1" value="(&amp;(sAMAccountName={0})(|(memberOf=CN=ROLE_ADMIN,OU=OpenKM,DC=company,DC=com)(memberOf=CN=ROLE_USER,OU=OpenKM,DC=company,DC=com)))" />
<beans:constructor-arg index="2" ref="contextSource" />
<beans:property name="searchSubtree" value="true" />
</beans:bean>
<beans:bean id="defaultLdapAuthoritiesPopulator" class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
<beans:constructor-arg ref="contextSource"/>
<beans:constructor-arg value="DC=company,DC=com"/>
<beans:property name="groupSearchFilter" value="member={0}"/>
<beans:property name="groupRoleAttribute" value="cn"/>
<beans:property name="searchSubtree" value="true" />
<beans:property name="convertToUpperCase" value="false" />
<beans:property name="rolePrefix" value="" />
<beans:property name="defaultRole" value="ROLE_USER" />
</beans:bean>
<!--Needed for remember-me services -->
<beans:bean id="userDetailService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
<beans:constructor-arg ref="userSearch"/>
<beans:constructor-arg ref="defaultLdapAuthoritiesPopulator"/>
</beans:bean>
</beans:beans>

org.springframework.beans.factory.parsing.BeanDefinitionParsingException

Sección titulada «org.springframework.beans.factory.parsing.BeanDefinitionParsingException»

Si ve un error como este “org.springframework.beans.factory.parsing.BeanDefinitionParsingException”, probablemente tenga establecida una versión de spring incorrecta en el OpenKM.xml:

Solución:

Edite el archivo OpenKM.xml y elimine los números de versión:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd">

a

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">

LDAP: error code 8 - BindSimple: Transport encryption required

Sección titulada «LDAP: error code 8 - BindSimple: Transport encryption required»

El error de cifrado de transporte requerido suele producirse cuando intenta conectarse con ldaps (con cifrado SSL) y no ha configurado el certificado de confianza en el almacén de certificados de JAVA.

En primer lugar, compruebe que utiliza “ldaps://” - termina en s - en su archivo OpenKM.xml para la conexión; cuando obtenga este error debe utilizarlo.

El primer paso es obtener el certificado del servidor; para ello siga los pasos siguientes:

Ventana de terminal
$ openssl s_client -showcerts -connect  your.ldap.server.com:636

La salida contendrá varias entradas delimitadas con:

-----BEGIN CERTIFICATE-----
aklfhskfadljasdl1340234234ASDSDFSDFSDFSDFSD
....
-----END CERTIFICATE-----

Copie la última entrada de certificado en un archivo (ldapca.crt)
Después, añádalo al keystore de java en $JRE_HOME/lib/security

Ventana de terminal
$ cd $TOMCAT_HOME
$ mkdir jks
$ keytool -import -alias ldapca_self_sign -keystore cacerts -storepass changeit -file ldapca.crt

Por último, habilite el trust store en el archivo $TOMCAT_HOME/bin/setenv.sh

# JAVA enable trust store
JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=/etc/pki/java/cacerts -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=JKS"

Ldap error: Caused by java.security.cert.CertificateException: No subject alternative DNS name matching

Sección titulada «Ldap error: Caused by java.security.cert.CertificateException: No subject alternative DNS name matching»

En el registro puede aparecer un error con una traza de pila como:

Caused by: java.security.cert.CertificateException: No subject alternative DNS name matching ldap.openkm.com found.
at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:214)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:96)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:459)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:436)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:200)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1621)
... 72 more

O como:

Caused by: org.springframework.ldap.CommunicationException: simple bind failed: ldap.openkm.com:636; nested exception is javax.naming.CommunicationException: simple bind failed: email.ied.edu.hk:636 [Root exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching email.ied.edu.hk found.]
at org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:100)
at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:285)
at org.springframework.ldap.core.support.AbstractContextSource.doGetContext(AbstractContextSource.java:119)
at org.springframework.ldap.core.support.AbstractContextSource.getReadOnlyContext(AbstractContextSource.java:138)
at org.springframework.ldap.core.LdapTemplate.executeReadOnly(LdapTemplate.java:791)
at org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntry(SpringSecurityLdapTemplate.java:194)
at org.springframework.security.ldap.search.FilterBasedLdapUserSearch.searchForUser(FilterBasedLdapUserSearch.java:116)
at org.springframework.security.ldap.authentication.BindAuthenticator.authenticate(BindAuthenticator.java:90)
at org.springframework.security.ldap.authentication.LdapAuthenticationProvider.doAuthentication(LdapAuthenticationProvider.java:178)

Modifique los parámetros de configuración de la JVM en setenv.sh o setenv.bat añadiendo el parámetro de configuración de la JVM:

Ventana de terminal
-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true