执行ldapTemplate.authenticate()时为什么baseDN不正确?

时间:2012-12-03 21:30:11

标签: java spring active-directory ldap spring-ldap

我正在尝试使用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

编辑:我更改了用户DN:cn = username,out = people,dc = example,dc = com 这仍然会给出错误32代码。

4 个答案:

答案 0 :(得分:5)

谢谢你们,你的线索确实揭示了这个问题。

首先,userDN确实不正确。我修正了(请参阅原始帖子中的编辑)。

其次,由于我已经在ldapContextSource中指定了baseDN,因此在调用authenticate()时无需再次执行。因此,使用DistinguishedName.EMPTY_PATH解决了这个问题。

第三,我的等于过滤器不正确。当我更改了userDN时,我忘记了sAMAccountName需要更改为实际的登录名,而不是最初设置的userDN。

ldapTemplate.authenticate()现在返回true,这意味着我已经过身份验证。

答案 1 :(得分:1)

我认为这不是基本的DN问题。我认为找不到用户。您是否正确设置了搜索范围?

答案 2 :(得分:1)

您的userDN看起来很可疑。 DN应该看起来像cn ='username',ou ='rest of path',dc = example,dc = com。我没有在你的代码中看到它的使用,只有用户。用户应该是'用户名'。

答案 3 :(得分:1)

搜索中的基础对象(-b参数的值)与简单绑定(-D参数)中使用的可分辨名称不同。结果代码32(在搜索响应中)表示未找到基础对象(在搜索请求中)。

另见