我可以使用 Spring-ldap 为 ContextSource 生命周期配置的用户对 Active Directory 进行身份验证。我的 Spring xml 配置看起来像这样:
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
<property name="contextSource" ref="contextSource" />
</bean>
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="ldap://xxx.xxx.xxx.xxx:389" />
<property name="userDn" value="myName@xxx.xxx" />
<property name="password" value="password" />
</bean>
验证用户的java代码是:
public boolean login(String username, String password) {
AndFilter filter = new AndFilter();
this.ldapTemplate.setIgnorePartialResultException(true); // Active Directory doesn’t transparently handle referrals. This fixes that.
filter.and(new EqualsFilter("objectCategory","****"));
filter.and(new EqualsFilter("objectClass","****"));
filter.and(new EqualsFilter("sAMAccountName", username));
return this.ldapTemplate.authenticate("OU=myBaseOu,DC=xyz,DC=def", filter.encode(), password);
}
即使我没有在contextSource中设置userDn和password属性,Linux open Ldap v3 也同样适用 bean 中
我只需要配置这个 xml,以便我可以作为匿名用户访问 Active Directory(无需设置 userDn 和密码)。
我还需要通过 SSL 对用户进行身份验证。为此我使用
<property name="url" value="ldaps://xxx.xxx.xxx.xxx:636" />
但我得到了例外:
Exception in thread "main" org.springframework.ldap.CommunicationException: simple bind failed: 192.168.0.13:636; nested exception is javax.naming.CommunicationException: simple bind failed: 192.168.0.13:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
不过,在搜索时,我得到了需要指出存储证书的密钥库的解决方案。在这里,我不确定在哪里(在 java 类或 xml 文件中)。
您的快速回复将不胜感激。谢谢。