webdevqa.jp.net

複数の特定のOUを検索するためのLDAPルートクエリ構文

ルートクエリ内の2つの特定の組織単位(OU)を検索する単一のLDAPクエリを実行する必要がありますが、それは難しいです。以下のクエリを試しましたが、どちらも成功しませんでした:

(|(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))

私の質問は単一のクエリで複数の単一OU をクエリすることは可能ですか? ルートLDAPクエリのこのタイプの式の適切な構文であると仮定します。

24
James

あなたはできる!!!要するに、これを接続文字列として使用します。

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

検索フィルターと一緒に、例えば.

(&(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>))))

それはいわゆる Global Catalog で検索します。これは私たちの環境ですぐに利用可能でした。

環境で動作しませんでした複数のOUを持つ既知/一般的な他のバージョン(またはその組み合わせ)の代わりに:

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)

(私は開発者であり、AD/LDAPの第一人者ではありません:)くそ、ほぼ2日間どこでもこのソリューションを探していましたが、ほとんどあきらめて、この明らかに非常に一般的なシナリオを手動で実装する必要があるかもしれないという考えに慣れました( Jasperserver/Springセキュリティ(/ Tomcat)を使用)。 (だから、誰か他の人や私が将来この問題を再び抱えるなら、これはリマインダーになるでしょう:O))

ここで、私が研究中に見つけた他のいくつかの関連するスレッドは、ほとんど役に立たなかった:

そしてここでは、役に立つかもしれない場合に備えて、匿名化されたTomcat LDAP設定を提供します(/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

答えは「いいえ」です。どうして?

LDAP標準では、LDAP-SEARCHが4つのパラメーターを持つ一種の機能として記述されているためです。

  1. 検索を開始するノード、識別名(DN)
  2. 持ち帰りたい属性
  3. 検索の深さ(ベース、1レベル、サブツリー)
  4. フィルター

フィルターに興味があります。要約があります ここ (MicrosoftがActive Directoryに提供しているもので、標準のものです)。フィルターは、ブール型で、タイプAttribute Operator Value

したがって、指定するフィルターは何の意味もありません。

理論的には、DNパスでbuildindフィルターを使用できる ExtensibleMatch がありますが、Active Directoryではサポートされていません。

私の知る限り、ADの属性を使用して、2つのOUのユーザーを区別する必要があります。

既存のディスクリミネーター属性、またはorganizationalPersonクラスから継承されたOUと呼ばれる属性などです。一部のユーザーには「スタッフ」を、他のユーザーには「ベンダー」を設定し、フィルターを使用します(自動ではないため、ユーザーを移動しても維持されません)。

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

簡単だ。ポートを変更するだけです。 389の代わりに3268を使用します。ドメイン名DOMAIN.LOCALの場合、検索でputDC = DOMAIN、DC = LOCAL

ポート3268:このポートは、グローバルカタログを特に対象とするクエリに使用されます。ポート3268に送信されたLDAP要求を使用して、フォレスト全体のオブジェクトを検索できます。ただし、グローバルカタログへのレプリケーション用にマークされた属性のみを返すことができます。

ポート389:このポートは、ドメインコントローラーから情報を要求するために使用されます。ポート389に送信されたLDAP要求は、グローバルカタログのホームドメイン内でのみオブジェクトを検索するために使用できます。ただし、アプリケーションは、検索されたオブジェクトのすべての属性を取得できます。

5
zied omrani

これはADでは不可能だと思います。私が知っているdistinguishedName属性は、検索しようとしているOU部分を含む唯一のものであるため、これらのOUの下のオブジェクトの結果を取得するにはワイルドカードが必要です。残念ながら、ワイルドカード文字 サポートされていません DN。

可能であれば、基本DNとしてOU = Staff ...とOU = Vendors ...を使用して、2つのクエリでこれを実行することを実際に検討します。

2
vinny

LDAPの専門家と話した後、この方法は不可能です。 1つのクエリで複数のDCまたはOUを検索できません。

オプションは次のとおりです。

  1. 1回以上のクエリを実行し、結果を解析します。
  2. フィルターを使用して、ADグループなどの別の属性に基づいて、または名前で目的のユーザー/オブジェクトを見つけます。
1
Philip Rego