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

标签 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

最佳答案

您需要阅读 LDAP 的一些基础知识(如果您通过 google 搜索,很容易找到教程):条目的专有名称 (DN) 是其唯一标识符,指定在 LDAP 树中可以找到该条目的位置。 LDAP 条目上的属性是绑定(bind)到该条目的数据。

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

关于java - LDAP:buildDn() 和 context.setAttributeValues 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31678759/

相关文章:

java - 如果 DistinguishedName 有引号,则无法从组中获取成员

java - N*N 矩阵,计算唯一方矩阵的数量..?

java - POST 中未处理作为 QueryParam 的数组

active-directory - DirectoryEntry memberOf 属性返回完整路径

c# - 如何在 LDAP 服务器上查找用户

rest - RESTful Jersey 的gradle依赖关系

java - 如何使用 ()、[]、{} 检查器修复此输出问题?

java - 使用Java将HDFS文件拆分为多个本地文件

java - 变量的内存分配和生命周期

json - RestController 中的 Spring SCALA 返回列表