0

Spring MVC アプリケーションでユーザーを認証しようとしています。ドメイン内に Active Directory サーバーがありますが、Web サーバーはドメイン外にあるため、OpenLDAP プロキシ サーバーを確立する必要があります。

まず、ドメイン内で接続を確立しようとして成功したため、アプリケーションは正常に動作し、認証を行います。すべて大丈夫です...しかし

何百もの Web サイト (新しい cn=conf 構成のため - slap.conf ではありません。ほとんどの Web サイトが非推奨の構成について説明しているため、IMO を知るのは非常に困難です) とフォーラムを読んだ後、最終的に LDAP を使用してプロキシ サーバーを構成しました。プロキシのように機能します。問題がないわけではありません - ldapsearch を呼び出した後にハングしますが、それでも結果が返されます。

問題は、OpenLDAP の私の構成の ldapsearch が user@domain.com 表記の識別名を受け入れないことです... 受け入れられるだけです...ログファイルは次のように述べています:

11 月 13 日 14:24:52 ip-10-0-0-121 slapd[19149]: conn=1001 op=0 do_bind 11 月 13 日 14:24:52 ip-10-0-0-121 slapd[19149]: > >> dnPrettyNormal: 11 月 13 日 14:24:52 ip-10-0-0-121 slapd[19149]: conn=1001 op=0 do_bind: 無効な dn (user@domain.com) 11 月 13 日 14:24:52 ip -10-0-0-121 slapd[19149]: send_ldap_result: conn=1001 op=0 p=3

したがって、 >>> dnPrettyNormal : は受け入れられませんが、私の春のアプリケーションから生成されます...

それを解決するには2つの方法があると思います:

  1. (私が好む)「アット」(@)文字を使用した表記を受け入れるようにOpenLDAPをセットアップします....
  2. Spring アプリケーションにフォーマットを強制的に送信させますが、どうすればよいでしょうか?

私のspring-security.xml:

    <authentication-manager>
    <authentication-provider ref="ldapActiveDirectoryAuthProvider" />
</authentication-manager>

<beans:bean id="ldapActiveDirectoryAuthProvider"
    class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <beans:constructor-arg value="domain.com" />
    <beans:constructor-arg value="ldap://xx.xx.xx.xx:389/" /> <!--fake IP-->
    <beans:property name="authoritiesMapper" ref="grantedAuthoritiesMapper" />
    <beans:property name="useAuthenticationRequestCredentials"
        value="true" />
    <beans:property name="convertSubErrorCodesToExceptions"
        value="true" />
</beans:bean>

<beans:bean id="grantedAuthoritiesMapper"
    class="com.xxx.ActiveDirectoryGrantedAuthoritiesMapper" />

私の問題を解決する方法を教えてください。


解決策/更新:

接続をセットアップすることができました。現在、ActiveDirectoryLdapAuthenticationProvider の代わりに LdapAuthenticationProvider を使用しています。

<authentication-manager>
    <authentication-provider ref='ldapProvider' />
</authentication-manager>

<!-- This bean points at the embedded directory server created by the ldap-server 
    element above -->
<beans:bean id="contextSource"
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <beans:constructor-arg value="ldap://xx.xx.xx.xx:389/dc=domain,dc=com" />
    <beans:property name="baseEnvironmentProperties">
        <beans:map>
            <beans:entry key="java.naming.referral" value="ignore" />
        </beans:map>
    </beans:property>
    <beans:property name="userDn"
        value="CN=user,OU=group,dc=domain,dc=com" />
    <beans:property name="password" value="secret" />
</beans:bean>

<beans:bean id="ldapProvider"
    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">
                <beans:bean id="userSearch"
                    class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
                    <beans:constructor-arg index="0" value="" />
                    <beans:constructor-arg index="1"
                        value="(sAMAccountName={0})" />
                    <beans:constructor-arg index="2" ref="contextSource" />
                    <beans:property name="searchSubtree" value="true" />
                </beans:bean>
            </beans:property>
        </beans:bean>
    </beans:constructor-arg>
    <beans:constructor-arg>
        <beans:bean
            class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
            <beans:constructor-arg ref="contextSource" />
            <beans:constructor-arg value="" />
            <beans:property name="searchSubtree" value="true" />
            <beans:property name="rolePrefix" value="ROLE_" />
            <beans:property name="convertToUpperCase" value="true" />
            <beans:property name="ignorePartialResultException"
                value="true" />
        </beans:bean>
    </beans:constructor-arg>
4

1 に答える 1

0

文字列user@domain.comは有効な識別名ではありません。DNは相対識別名 (RDN) のカンマ区切りのシーケンスであり、それぞれtype=valuetype属性タイプ (OID または OID のエイリアスなど)の形式の attributeType-attributeValue アサーションですmailmail=user@domain.com,dc=domain,dc=com有効な識別名です。構成内の DN を修正して、有効なストリングを使用してください。@問題は ' ' 文字とは関係ありません。

于 2012-11-13T16:31:43.737 に答える