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 Quedando los tres beans configurados de la siguiente manera code Toggle line numbers <bean id="initialDirContextFactory" class="org.acegisecurity.ldap DefaultInitialDirContextFactory > <constructor-arg value="ldap:ldap.zylk.net:389/dc=zylk,dc=net"/> </bean> /code Donde se indica el servidor sobre el que se va a intentar hacer la validación. En este caso el bind que se realiza es anónimo. Por lo que el LDAP debería estar configurado para poder preguntar anónimamente la validez de un usuario y sus ROLES/GRUPOS. En el caso de que esto no sea así, habrá que añadir al bean las siguientes propiedades
  • <property name="managerDn"><value>dn del usuario con el que se realiza el bind</value></property>
  • <property name="managerPassword"><value>password</value></property>
code Toggle line numbers
    <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>(&amp;(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:
  1. se busca usuario en el nodo People de (dc=zylk,dc=net) que tengan uid = login
  2. 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.
Lo único que quedaría por indicar es que el cn de los grupos debe corresponder con una de la constante del JasperServer * ROLE_ADMINISTRATOR
  • ROLE_USER
  • ROLE_ANONYMOUS
Anotar también que los archivos de configuración requieren redesplegar el JasperServer
Promedio (0 Votos)
Comentarios