web-dev-qa-db-fra.com

Syntaxe de requête racine LDAP pour rechercher plusieurs unités d'organisation spécifiques

J'ai besoin d'exécuter une seule requête LDAP qui effectuera une recherche dans deux unités d'organisation (UO) spécifiques dans la requête racine, mais j'ai du mal à le faire. J'ai essayé les requêtes suivantes ci-dessous et aucune n'a réussi:

(|(OU=Staff,DC=my,DC=super,DC=org)(OU=Vendors,DC=my,DC=super,DC=org))

((OU=Staff,DC=my,DC=super,DC=org) | (OU=Vendors,DC=my,DC=super,DC=org))

Ma question est; est-il possible d'interroger plus d'une unité d'organisation unique dans une seule requête? En supposant que c'est la syntaxe appropriée pour ce type d'expression dans la requête LDAP racine.

24
James

Vous pouvez!!! En bref, utilisez ceci comme chaîne de connexion:

ldap://<Host>:3268/DC=<my>,DC=<domain>?cn

avec votre filtre de recherche, par ex.

(&(sAMAccountName={0})(&((objectCategory=person)(objectclass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=<some-special-nested-group>,OU=<ou3>,OU=<ou2>,OU=<ou1>,DC=<dc3>,DC=<dc2>,DC=<dc1>))))

Cela va chercher dans le soi-disant Global Catalog , qui était disponible dès le départ dans notre environnement.

Au lieu des autres versions connues/communes (ou combinaisons de celles-ci) qui ne fonctionnaient PAS dans notre environnement avec plusieurs unités d'organisation:

ldap://<Host>/DC=<my>,DC=<domain>
ldap://<Host>:389/DC=<my>,DC=<domain>  (standard port)
ldap://<Host>/OU=<someOU>,DC=<my>,DC=<domain>
ldap://<Host>/CN=<someCN>,DC=<my>,DC=<domain>
ldap://<Host>/(|(OU=<someOU1>)(OU=<someOU2>)),DC=<my>,DC=<domain> (search filters here shouldn't work at all by definition)

(Je suis un développeur, pas un gourou AD/LDAP :) Merde, je cherchais cette solution partout depuis près de 2 jours et j'ai presque abandonné, m'habituant à l'idée que je devrais peut-être implémenter ce scénario évidemment très courant à la main ( avec Jasperserver/Spring security (/ Tomcat)). (Donc, ce sera un rappel si quelqu'un d'autre ou moi devrait avoir à nouveau ce problème à l'avenir: O))

Voici quelques autres sujets connexes que j'ai trouvés au cours de mes recherches qui m'ont été très peu utiles:

Et ici, je vais fournir notre configuration Tomcat LDAP anonyme au cas où cela pourrait être utile (/var/lib/Tomcat7/webapps/jasperserver/WEB-INF/applicationContext-externalAUTH-LDAP.xml):

<beans xmlns="http://www.springframework.org/schema/beans"
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">

<!-- ############ LDAP authentication ############ - Sample configuration 
    of external authentication via an external LDAP server. -->


<bean id="proxyAuthenticationProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.BaseAuthenticationProcessingFilter">
    <property name="authenticationManager">
        <ref local="ldapAuthenticationManager" />
    </property>
    <property name="externalDataSynchronizer">
        <ref local="externalDataSynchronizer" />
    </property>

    <property name="sessionRegistry">
        <ref bean="sessionRegistry" />
    </property>

    <property name="internalAuthenticationFailureUrl" value="/login.html?error=1" />
    <property name="defaultTargetUrl" value="/loginsuccess.html" />
    <property name="invalidateSessionOnSuccessfulAuthentication"
        value="true" />
    <property name="migrateInvalidatedSessionAttributes" value="true" />
</bean>

<bean id="proxyAuthenticationSoapProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.DefaultAuthenticationSoapProcessingFilter">
    <property name="authenticationManager" ref="ldapAuthenticationManager" />
    <property name="externalDataSynchronizer" ref="externalDataSynchronizer" />

    <property name="invalidateSessionOnSuccessfulAuthentication"
        value="true" />
    <property name="migrateInvalidatedSessionAttributes" value="true" />
    <property name="filterProcessesUrl" value="/services" />
</bean>

<bean id="proxyRequestParameterAuthenticationFilter"
    class="com.jaspersoft.jasperserver.war.util.ExternalRequestParameterAuthenticationFilter">
    <property name="authenticationManager">
        <ref local="ldapAuthenticationManager" />
    </property>
    <property name="externalDataSynchronizer" ref="externalDataSynchronizer" />

    <property name="authenticationFailureUrl">
        <value>/login.html?error=1</value>
    </property>
    <property name="excludeUrls">
        <list>
            <value>/j_spring_switch_user</value>
        </list>
    </property>
</bean>

<bean id="proxyBasicProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.ExternalAuthBasicProcessingFilter">
    <property name="authenticationManager" ref="ldapAuthenticationManager" />
    <property name="externalDataSynchronizer" ref="externalDataSynchronizer" />

    <property name="authenticationEntryPoint">
        <ref local="basicProcessingFilterEntryPoint" />
    </property>
</bean>

<bean id="proxyAuthenticationRestProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.DefaultAuthenticationRestProcessingFilter">
    <property name="authenticationManager">
        <ref local="ldapAuthenticationManager" />
    </property>
    <property name="externalDataSynchronizer">
        <ref local="externalDataSynchronizer" />
    </property>

    <property name="filterProcessesUrl" value="/rest/login" />
    <property name="invalidateSessionOnSuccessfulAuthentication"
        value="true" />
    <property name="migrateInvalidatedSessionAttributes" value="true" />
</bean>



<bean id="ldapAuthenticationManager" class="org.springframework.security.providers.ProviderManager">
    <property name="providers">
        <list>
            <ref local="ldapAuthenticationProvider" />
            <ref bean="${bean.daoAuthenticationProvider}" />
            <!--anonymousAuthenticationProvider only needed if filterInvocationInterceptor.alwaysReauthenticate 
                is set to true <ref bean="anonymousAuthenticationProvider"/> -->
        </list>
    </property>
</bean>

<bean id="ldapAuthenticationProvider"
    class="org.springframework.security.providers.ldap.LdapAuthenticationProvider">
    <constructor-arg>
        <bean
            class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
            <constructor-arg>
                <ref local="ldapContextSource" />
            </constructor-arg>
            <property name="userSearch" ref="userSearch" />
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean
            class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator">
            <constructor-arg index="0">
                <ref local="ldapContextSource" />
            </constructor-arg>
            <constructor-arg index="1">
                <value></value>
            </constructor-arg>

            <property name="groupRoleAttribute" value="cn" />
            <property name="convertToUpperCase" value="true" />
            <property name="rolePrefix" value="ROLE_" />
            <property name="groupSearchFilter"
                value="(&amp;(member={0})(&amp;(objectCategory=Group)(objectclass=group)(cn=my-nested-group-name)))" />
            <property name="searchSubtree" value="true" />
            <!-- Can setup additional external default roles here <property name="defaultRole" 
                value="LDAP"/> -->
        </bean>
    </constructor-arg>
</bean>

<bean id="userSearch"
    class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg index="0">
        <value></value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>(&amp;(sAMAccountName={0})(&amp;((objectCategory=person)(objectclass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=my-nested-group-name,OU=ou3,OU=ou2,OU=ou1,DC=dc3,DC=dc2,DC=dc1))))
        </value>
    </constructor-arg>
    <constructor-arg index="2">
        <ref local="ldapContextSource" />
    </constructor-arg>
    <property name="searchSubtree">
        <value>true</value>
    </property>
</bean>

<bean id="ldapContextSource"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.ldap.JSLdapContextSource">
    <constructor-arg value="ldap://myhost:3268/DC=dc3,DC=dc2,DC=dc1?cn" />
    <!-- manager user name and password (may not be needed) -->
    <property name="userDn" value="CN=someuser,OU=ou4,OU=1,DC=dc3,DC=dc2,DC=dc1" />
    <property name="password" value="somepass" />
    <!--End Changes -->
</bean>
<!-- ############ LDAP authentication ############ -->

<!-- ############ JRS Synchronizer ############ -->
<bean id="externalDataSynchronizer"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.ExternalDataSynchronizerImpl">
    <property name="externalUserProcessors">
        <list>
            <ref local="externalUserSetupProcessor" />
            <!-- Example processor for creating user folder -->
            <!--<ref local="externalUserFolderProcessor"/> -->
        </list>
    </property>
</bean>

<bean id="abstractExternalProcessor"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.processors.AbstractExternalUserProcessor"
    abstract="true">
    <property name="repositoryService" ref="${bean.repositoryService}" />
    <property name="userAuthorityService" ref="${bean.userAuthorityService}" />
    <property name="tenantService" ref="${bean.tenantService}" />
    <property name="profileAttributeService" ref="profileAttributeService" />
    <property name="objectPermissionService" ref="objectPermissionService" />
</bean>

<bean id="externalUserSetupProcessor"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.processors.ExternalUserSetupProcessor"
    parent="abstractExternalProcessor">
    <property name="userAuthorityService">
        <ref bean="${bean.internalUserAuthorityService}" />
    </property>
    <property name="defaultInternalRoles">
        <list>
            <value>ROLE_USER</value>
        </list>
    </property>

    <property name="organizationRoleMap">
        <map>
            <!-- Example of mapping customer roles to JRS roles -->
            <entry>
                <key>
                    <value>ROLE_MY-NESTED-GROUP-NAME</value>
                </key>
                <!-- JRS role that the <key> external role is mapped to -->
                <value>ROLE_USER</value>
            </entry>
        </map>
    </property>
</bean>

<!--bean id="externalUserFolderProcessor" class="com.jaspersoft.jasperserver.api.security.externalAuth.processors.ExternalUserFolderProcessor" 
    parent="abstractExternalProcessor"> <property name="repositoryService" ref="${bean.unsecureRepositoryService}"/> 
    </bean -->

<!-- ############ JRS Synchronizer ############ -->
19
Andreas Dietrich

La réponse est NON, vous ne pouvez pas. Pourquoi?

Parce que la norme LDAP décrit un LDAP-SEARCH comme une sorte de fonction avec 4 paramètres:

  1. Le nœud où la recherche doit commencer, qui est un nom distinctif (DN)
  2. Les attributs que vous souhaitez récupérer
  3. La profondeur de la recherche (base, un niveau, sous-arbre)
  4. Le filtre

Vous êtes intéressé par le filtre. Vous avez un résumé ici (il est fourni par Microsoft pour Active Directory, il provient d'une norme). Le filtre est composé, de manière booléenne, par l'expression de type Attribute Operator Value.

Le filtre que vous donnez ne signifie donc rien.

Du point de vue théorique, il y a ExtensibleMatch qui permet de créer des filtres sur le chemin DN, mais il n'est pas pris en charge par Active Directory.

Pour autant que je sache, vous devez utiliser un attribut dans AD pour faire la distinction pour les utilisateurs dans les deux unités d'organisation.

Il peut s'agir de n'importe quel attribut discriminateur existant, ou, par exemple, l'attribut appelé OU qui est hérité de la classe organizationalPerson. vous pouvez le définir (ce n'est pas automatique, et ne sera pas maintenu si vous déplacez les utilisateurs) avec "staff" pour certains utilisateurs et "vendors" pour d'autres et eux utilisent le filtre:

(&(objectCategory=person)(|(ou=staff)(ou=vendors)))
14
JPBlanc

C'est simple. Changez simplement le port. Utilisez 3268 au lieu de 389. Si votre nom de domaine DOMAIN.LOCAL , dans la recherche, mettez DC = DOMAIN, DC = LOCAL

Port 3268: Ce port est utilisé pour les requêtes spécifiquement ciblées pour le catalogue global. Les requêtes LDAP envoyées au port 3268 peuvent être utilisées pour rechercher des objets dans la forêt entière. Cependant, seuls les attributs marqués pour la réplication dans le catalogue global peuvent être renvoyés.

Port 389: Ce port est utilisé pour demander des informations au contrôleur de domaine. Les requêtes LDAP envoyées au port 389 peuvent être utilisées pour rechercher des objets uniquement dans le domaine principal du catalogue global. Cependant, l'application peut obtenir tous les attributs des objets recherchés.

5
zied omrani

Je ne pense pas que ce soit possible avec AD. L'attribut distinguéName est la seule chose que je sache qui contient l'élément OU sur lequel vous essayez de rechercher, vous auriez donc besoin d'un caractère générique pour obtenir des résultats pour les objets sous ces unités d'organisation. Malheureusement, le caractère générique n'est pas pris en charge sur les DN.

Si possible, j'aimerais vraiment le faire dans 2 requêtes en utilisant OU = Staff ... et OU = Vendors ... comme DN de base.

2
vinny

Après avoir parlé avec un expert LDAP, ce n'est pas possible de cette façon. Une requête ne peut pas rechercher plus d'un DC ou OU.

Vos options sont:

  1. Exécutez plus d'une requête et analysez le résultat.
  2. Utilisez un filtre pour trouver les utilisateurs/objets souhaités en fonction d'un attribut différent comme un groupe AD ou par nom.
1
Philip Rego