LDAP - 如何向groupOfUniqueNames添加条目? (ERR_250_ENTRY_ALREADY_EXISTS)

时间:2017-09-13 19:42:09

标签: ruby ldap apacheds

我试图添加groupOfUniqueNames对象的新成员,但我得到了一个" ENTRY_ALREADY_EXISTS"错误。

服务器是ApacheDS,我的代码是Ruby,使用net-ldap:

ldap.add(dn: 'cn=janitors,dc=tidy,dc=example,dc=com', 
         attributes: 
          {
            :objectclass => "groupOfUniqueNames",
            :uniqueMember => 
              "uid=broom001,o=users,dc=tidy,dc=example,dc=com"
          }
)

门卫中已有一名成员 - mop99。当我调用ldap.add时,我得到(为了便于阅读而略微重新格式化):

ldap.response: ERR_250_ENTRY_ALREADY_EXISTS cn=janitors,dc=tidy,dc=example,dc=com already exists!
OpenStruct {
             :code => 68,
    :error_message => "ENTRY_ALREADY_EXISTS: failed for MessageType : ADD_REQUEST
                        Message ID : 2
                            Add Request :
                            Entry
                            dn[n]: cn=janitors,dc=tidy,dc=example,dc=com
                            objectclass: groupOfUniqueNames
                            uniqueMember: uid=mop99,o=users,dc=tidy,dc=example,dc=com
                            : ERR_250_ENTRY_ALREADY_EXISTS cn=janitors,dc=tidy,dc=example,dc=com already exists!
                      ",
       :matched_dn => "",
          :message => "Entry Already Exists"
}

我尝试将ldap.add()更改为ldap.modify(),但这只是用broom001替换mop99,只留下一个看门人。我需要的是添加 broom001,以结束不断增长的清洁工队伍。

我可以从LDAP中读取现有列表,将新条目附加到Ruby中的列表中,然后将列表写回LDAP ...但是这会引入竞争条件,当两个尝试添加时,清除程序可能会丢失同时。我的看门人太贵了,所以这是不可接受的。

我在广泛搜索网页时没有发现太多内容,也没有与net-ldap相关的内容。我确实找到https://www.openldap.org/lists/openldap-software/199912/msg00164.html来描述解决方案WRT .LDIF文件,但我不知道如何将其转换为net-ldap。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

添加对象类没有意义。它已经存在了。

只需添加唯一成员值。

答案 1 :(得分:0)

好的......我觉得有点傻。这是正确的答案:

ldap.add_attribute(dn, attribute, value)

或者特别是我的新看门人:

ldap.add_attribute('cn=janitors,dc=tidy,dc=example,dc=com', 
                   'uniqueMember',
                   'uid=broom001,o=users,dc=tidy,dc=example,dc=com')

钡热潮。就是这样。正是我需要的。 腮红

我离开了我以前荒谬的回答,因为它从头开始填充列表的一种方式,在某些情况下可能会有用。

我还要留下这个令人尴尬的问题,以防其他人在文档中忽略add_attribute()并且在尝试搜索此问题时感到沮丧。

对于似乎仍然存在的ruby-net-ldap仍然存在的一个挫败感是delete_attribute()不接受第三个参数 - 即要从组中删除的值。您只能使用delete_attribute删除整个组,而不能删除单个条目。但我不需要只从组中删除一个值,所以la-ti-da ...