我试图添加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。
我错过了什么?
答案 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 ...