我正在尝试使用Spring的LDAP软件包针对活动目录进行身份验证,但是我一直收到一条错误消息,提示我指定了错误的baseDN(Ldap错误代码32):
org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E4, problem 2001 (NO_OBJECT), data 0, best match of:
[testng] 'OU=People,DC=example,DC=com'
[testng] ]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E4, problem 2001 (NO_OBJECT), data 0, best match of:
[testng] 'OU=People,DC=example,DC=com'
[testng] ]; remaining name 'ou=people,dc=example,dc=com'
奇怪的是ldapsearch命令使用完全相同的basedn,并且可以正常工作:
ldapsearch -V -x -H ldap://ad.example.com:389 -b 'ou=people,dc=example,dc=com' -D '<user>' -w '<password>' (sAMAccountName=<user>)
以下代码设置DN(以编程方式设置ldapContextSource):
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("sAMAccountName", user));
DistinguishedName dn = new DistinguishedName("ou=people,dc=example,dc=com");
boolean in = ldapTemplate.authenticate(dn, filter.toString(), password);
不确定这是否有帮助,但是这些是其他字段:
userDN = <myusername>@example.com
url = ldap://ad.example.com:389
password = <mypassword>
baseDN = ou=people,dc=example,dc=com
编辑:我更改了userDN:cn = username,out = people,dc = example,dc = com
这仍然给出错误32代码。
最佳答案
谢谢大家,您的线索确实阐明了这个问题。
首先,userDN确实不正确。我已修复该问题(请参见原始帖子中的编辑)。
其次,由于我已经在ldapContextSource中指定了baseDN,因此在调用authenticate()时无需再次进行设置。因此,使用DistinguishedName.EMPTY_PATH
解决了该问题。
第三,我的equals筛选器不正确。更改userDN时,我忘记了需要将sAMAccountName
更改为实际的登录名,而不是原来设置的userDN。
ldapTemplate.authenticate()现在返回true,这表示我已通过身份验证。