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つの方法があると思います:
- (私が好む)「アット」(@)文字を使用した表記を受け入れるようにOpenLDAPをセットアップします....
- 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>