LdapJasperServer
Modificación del proveedor de seguridad en JasperServer #
Uso de un LDAP como proveedor seguridad #
La idea es poder modificar el sistema por el que el JasperServer autentica y valida los usuarios. En este e vamos a configurar el JasperServer para que haga uso de los usuarios y grupos almacenados en un LDAP. El modelo de seguridad está basado en el proyecto acgi Configuración del proveedor de seguridad Primero tenemos que modificar el bean org.acegisecurity.providers ProviderManager de id authenticationManager del archivo $CATALINA_HOME/webapps/jasperserver/WEB-INF/appContext-security.xml. En este bean se definen el conjunto de proveedores de seguridad que el JasperServer va a intentar utilizar a la hora de validar un usuario. code Toggle line numbers
<bean id="authenticationManager" class="org.acegisecurity.providers [[ProviderManager|ProviderManager]] >
<property name="providers">
<list>
<ref local="ldapAuthenticationProvider"/>
<ref local="anonymousAuthenticationProvider"/>
</list>
</property>
</bean>
/code Una vez añadida la referencia a ldapAuthenticationProvider, configuramos dicho provider por medio de sus bean. Esta configuración se añade al archivos $CATALINA_HOME/webapps/jasperserver/WEB-INF/appContext-security.xml. Esencialmente la configuración se realiza por medio de tres beans
- org.acegisecurity.ldap DefaultInitialDirContextFactory de id initialDirContextFactory
- org.acegisecurity.ldap.search FilterBasedLdapUserSearch de id userSearch
- org.acegisecurity.providers.ldap LdapAuthenticationProvider de id ldapAuthenticationProvider
- <property name="managerDn"><value>dn del usuario con el que se realiza el bind</value></property>
- <property name="managerPassword"><value>password</value></property>
<bean id="userSearch" class="org.acegisecurity.ldap.search [[FilterBasedLdapUserSearch|FilterBasedLdapUserSearch]] >
<constructor-arg index="0">
<value></value>
</constructor-arg>
<constructor-arg index="1">
<value>(uid={0})</value>
</constructor-arg>
<constructor-arg index="2">
<ref local="initialDirContextFactory" />
</constructor-arg>
<property name="searchSubtree">
<value>true</value>
</property>
</bean>
/code Donde se indica que el valor pasado por el login se va a utilizar como segundo parámetro del constructor y además se va a preguntar por el uid. Por lo tanto el login se realizará contra el uid del nodo del LDAP. Se podría utilizar el cn o cualquier otro atributo del nodo LDAP.
Toggle line numbers
code
<bean id="ldapAuthenticationProvider" class="org.acegisecurity.providers.ldap [[LdapAuthenticationProvider|LdapAuthenticationProvider]] >
<constructor-arg>
<bean class="org.acegisecurity.providers.ldap.authenticator [[BindAuthenticator|BindAuthenticator]] >
<constructor-arg>
<ref local="initialDirContextFactory"/>
</constructor-arg>
<property name="userDnPatterns">
<list>
<value>uid={0},ou=People</value>
</list>
</property>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.acegisecurity.providers.ldap.populator [[DefaultLdapAuthoritiesPopulator|DefaultLdapAuthoritiesPopulator]] >
<constructor-arg index="0">
<ref local="initialDirContextFactory"/>
</constructor-arg>
<constructor-arg index="1">
<value>ou=jasper-groups</value>
</constructor-arg>
<property name="groupRoleAttribute">
<value>cn</value>
</property>
<property name="groupSearchFilter">
<value>(&(uniqueMember={0})(objectclass=groupofuniquenames))</value>
</property>
</bean>
</constructor-arg>
</bean>
/code En este bean se definen los campos de donde se va a obtener el usuario y sus ROLES/GRUPOS. Lo importante es indicar por un lado el nodo de búsqueda, tanto para los usuarios como para los roles, y los atributos del mach. En el ejemplo se indica:
- se busca usuario en el nodo People de (dc=zylk,dc=net) que tengan uid = login
- se buscan los grupos de dicho usuario en el nodo jasper-groups de (dc=zylk,dc=net) que cumplan el criterio indicado por el filtro (&(uniqueMember={0})(objectclass=groupofuniquenames)). Y se fija como ROL/GRUPO de ese usuario el valor cn de los nodos que cumplan el criterio.
- ROLE_USER
- ROLE_ANONYMOUS
3231 Accesos