Ejemplo de Active Directory con inicio de sesión basado en el filtrado de usuarios por roles
En este ejemplo veremos una conexión con Active Directory que permite conectarse a cualquier usuario autenticado en Active Directory que sea miembro de ROLE_USER o ROLE_ADMIN.
Estructura de LDAP
Sección titulada «Estructura de LDAP»dc=com dc=company ou=OPENKM cn=ROLE_ADMIN member=okmAdmin member=user1 cn=ROLE_USER member=user3 cn=ROLE_XXXX member=user2 cn=ROLE_YYYY member=user4 ... ou=organization1 sAMAccountName=okmAdmin memberOf=CN=ROLE_ADMIN,OU=OPENKM,DC=company,DC=com userPrincipalName=okmAdmin@mail.com cn=OpenKM Administrator sAMAccountName=user1 memberOf=CN=ROLE_ADMIN,OU=OPENKM,DC=company,DC=com userPrincipalName=user1@mail.com cn=User Name 1 sAMAccountName=user2 memberOf=CN=ROLE_XXXX,OU=OPENKM,DC=company,DC=com userPrincipalName=user2@mail.com cn=User Name 3 ou=organization2 sAMAccountName=user3 memberOf=CN=ROLE_USER,OU=OPENKM,DC=company,DC=com userPrincipalName=user3@mail.com cn=User Name 3 sAMAccountName=user4 memberOf=CN=ROLE_YYYY,OU=OPENKM,DC=company,DC=com userPrincipalName=user4@mail.com cn=User Name 4Grupos válidos:
- cn=ROLE_ADMIN,ou=OPENKM,dc=company,dc=com
- cn=ROLE_USER,ou=OPENKM,dc=company,dc=com
- cn=ROLE_XXXX,ou=OPENKM,dc=company,dc=com
- cn=ROLE_YYYY,ou=OPENKM,dc=company,dc=com
Usuarios válidos:
- cn=user1,ou=organization1,dc=company,dc=com
- cn=user2,ou=organization1,dc=company,dc=com
Usuarios no válidos:
- cn=user3,ou=organization2,dc=company,dc=com
- cn=user4,ou=organization2,dc=company,dc=com
Paso 1 - parámetros de configuración
Sección titulada «Paso 1 - parámetros de configuración»- Los usuarios que son miembros de ROLE_ADMIN o ROLE_USER pueden crearse en cualquier nodo de Active Directory, porque DC=company,DC=com está definido como filtro base, principal.ldap.user.search.base=DC=company,DC=com, y el filtro de búsqueda de usuarios es principal.ldap.user.search.filter=(&(objectclass=user)(|(memberOf=CN=ROLE_ADMIN,OU=OpenKM,DC=company,DC=com)(memberOf=CN=ROLE_USER,OU=OpenKM,DC=company,DC=com))).
- Los grupos pueden crearse en cualquier nodo de Active Directory porque tiene DC=company,DC=com como filtro base, principal.ldap.role.search.base=DC=company,DC=com.
- Se listarán todos los grupos de Active Directory porque no se ha aplicado ninguna restricción de filtro: principal.ldap.role.search.filter=(objectclass=group).
- El atributo de correo utilizado en este caso es userPrincipalName (el atributo LDAP más habitual para el correo es mail). principal.ldap.mail.attribute=userPrincipalName.
Vaya a Administración > Parámetros de configuración:
| Campo / Propiedad | Tipo | Descripción |
|---|---|---|
| principal.adapter | String | com.openkm.plugin.principal.LdapPrincipalAdapter |
| system.login.lowercase | String | true |
| principal.ldap.server | String | ldap://192.168.xxx.xxx:389 |
| principal.ldap.security.principal | String | CN=Administrator,OU=OPENKM,DC=company,DC=com |
| principal.ldap.security.credentials | String | password |
| principal.ldap.referral | String | follow |
| principal.ldap.users.from.roles | Boolean | false |
| principal.ldap.user.attribute | String | sAMAccountName |
| principal.ldap.user.search.base | List | DC=company,DC=com |
| principal.ldap.user.search.filter | String | (&(objectclass=user)(|(memberOf=CN=ROLE_ADMIN,OU=OpenKM,DC=company,DC=com)(memberOf=CN=ROLE_USER,OU=OpenKM,DC=company,DC=com))) |
| principal.ldap.username.attribute | String | cn |
| principal.ldap.username.search.base | String | DC=company,DC=com |
| principal.ldap.username.search.filter | String | (&(objectClass=person)(sAMAccountName={0})) |
| principal.ldap.mail.attribute | String | userPrincipalName |
| principal.ldap.mail.search.base | String | DC=company,DC=com |
| principal.ldap.mail.search.filter | String | (&(objectClass=person)(sAMAccountName={0})) |
| principal.ldap.role.attribute | String | cn |
| principal.ldap.role.search.base | List | DC=company,DC=com |
| principal.ldap.role.search.filter | String | (objectclass=group) |
| principal.ldap.roles.by.user.attribute | String | memberOf |
| principal.ldap.roles.by.user.search.base | String | DC=company,DC=com |
| principal.ldap.roles.by.user.search.filter | String | (&(objectClass=person)(sAMAccountName={0})) |
| principal.ldap.users.by.role.attribute | String | member |
| principal.ldap.users.by.role.search.base | String | OU=OpenKM,DC=company,DC=com |
| principal.ldap.users.by.role.search.filter | String | (&(objectClass=group)(cn={0})) |
Paso 2 - configurar el inicio de sesión
Sección titulada «Paso 2 - configurar el inicio de sesión»- Los usuarios creados en cualquier nodo de Active Directory que sean miembros de ROLE_ADMIN o ROLE_USER podrán iniciar sesión porque DC=company,DC=com está definido como filtro base, y principal.ldap.user.search.filter=(&(objectclass=user)(|(memberOf=CN=ROLE_ADMIN,OU=OpenKM,DC=company,DC=com)(memberOf=CN=ROLE_USER,OU=OpenKM,DC=company,DC=com))) es el filtro de cuentas de usuario.
- Los grupos leídos por OpenKM pueden crearse en cualquier nodo de Active Directory porque DC=company,DC=com está definido como filtro base.
Aplique los cambios en el fichero openkm.properties.
El parámetro “okm.authentication.database” se utiliza para deshabilitar el inicio de sesión mediante la base de datos.
El parámetro “okm.authentication.ldap” se utiliza para habilitar el inicio de sesión mediante LDAP.
#Authenticationokm.authentication.database=falseokm.authentication.ldap=true
#LDAPldap.server=ldap://192.168.0.13ldap.manager.distinguished.name=CN=Administrator,CN=Users,DC=openkm,DC=localldap.manager.password=*secret*ldap.base=DC=openkm,DC=localldap.role.attribute=cnldap.user.search.filter=(&(sAMAccountName={0})(|(memberOf=CN=ROLE_ADMIN,OU=OpenKM,DC=company,DC=com)(memberOf=CN=ROLE_USER,OU=OpenKM,DC=company,DC=com)))ldap.role.search.filter=member={0}Otra opción para configurar el inicio de sesión
Sección titulada «Otra opción para configurar el inicio de sesión»En algunos casos puede interesarle establecer la configuración en el fichero openkm.xml; consulte la sección de documentación Configuración de openkm.xml para obtener más informació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.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="(&(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: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>