LDAP:buildDn()和context.setAttributeValues之间的区别

时间:2015-07-28 14:07:59

标签: java rest ldap spring-ldap

与LDAP相对较新我会陷入所有想要的东西。目前我正在尝试添加用户。常见的示例代码通常有一个create函数和一个buildDn函数,但每个代码中的代码通常非常相似。这就是我所拥有的:

public void create(User u) {
    Name dn = buildDn(u);
    DirContextAdapter context = new DirContextAdapter(dn);
    context.setAttributeValues("objectclass", new String[] {"top", "person"});
    context.setAttributeValue("cn", u.getName());
    context.setAttributeValue("sAMAccountName", u.getUserName());
    _ldapTemplate.bind(context);
}

和buildDn函数:

protected Name buildDn( User u ) {
    return LdapNameBuilder.newInstance()
            .add("cn", u.getName())
            .add("sAMAccountName", u.getUserName())    
            .build();
}

我尝试添加用户时遇到的错误是500错误,控制台说:

Caused by: org.springframework.ldap.NameNotFoundException: 
[LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'OU=**,OU=**,DC=**,DC=**,DC=**']; 
nested exception is javax.naming.NameNotFoundException: 
[LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'OU=**,OU=**,DC=**,DC=**,DC=**'];
remaining name 'sAMAccountName=**,cn=**'

我用**替换了我的用户特定数据。由于上面提到的两个函数都是添加/设置属性,我不确定哪个是错误的以及为什么。也许我完全错过了这个问题。 TIA

1 个答案:

答案 0 :(得分:0)

您需要阅读一些LDAP的基础知识(如果你谷歌的话,很容易找到教程):条目的专有名称(DN)是它的唯一标识符,指定LDAP树中的位置可以找到条目。 LDAP条目上的属性是绑定到条目的数据。

在您的示例中,您需要修改buildDn函数,以在LDAP树中指定要放置LDAP条目的正确位置(相对于配置中指定的基本DN)。根据您要创建的LDAP条目的objectClass,可能还需要其他属性(条目的objectClass定义允许哪些属性以及哪些属性是必需的)