python - ldap3 库:如何向属性添加多个值
python - ldap3 lib: How to add multiple values to attribute
我想在 ldap 中为用户添加多个电子邮件地址。因此,当我 search/find 一个使用 ldapsearch 的特定用户时,一个名为 mailLocalAdress 的属性看起来像这样:
mailLocalAddress: abc@testing.com
mailLocalAddress: abcd@testing.com
mailLocalAddress: abcdefg@testing.com
我正在使用 python 3,ldap3 库,这就是我定义 mailLocalAdress 属性值的方式
ldap_values['mailLocalAddress'] = [user.email_first, user.email_second, user.email_third]
这是添加命令
ldap_con.add(dn, object_class, ldap_values)
我在执行 ldapsearch 时得到了这个结果
mailLocalAddress: ['abc@testing.com', 'abcd@testing.com', 'abcdefg@testing.com']
关于如何获得上面的列表的任何想法?
我无法重现您报告的行为。如果我从我的 ldap 目录开始:
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: example
dc: example
dn: ou=people,dc=example,dc=com
objectclass: organizationalunit
ou: people
然后运行以下Python代码:
>>> from ldap3 import Server, Connection, ALL
>>> server=Server('localhost')
>>> conn = Connection(server, user='cn=manager,dc=example,dc=com', password='secret')
>>> conn.bind()
True
>>> dn='uid=alice,ou=people,dc=example,dc=com'
>>> object_class=['person', 'organizationalperson', 'inetorgperson', 'inetlocalmailrecipient']
>>> ldap_values={'sn': 'example', 'cn': 'alice example', 'mailLocalAddress': ['alice@example.com', 'alice.example@example.com']}
>>> conn.add(dn, object_class, ldap_values)
True
>>>
一个ldapsearch
returns:
/etc/openldap # ldapsearch ... -b dc=example,dc=com uid=alice
# alice, people, example.com
dn: uid=alice,ou=people,dc=example,dc=com
sn: example
cn: alice example
mailLocalAddress: alice@example.com
mailLocalAddress: alice.example@example.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
uid: alice
这似乎正是您想要的。
这是一个完全不同的问题:
ldap_values = {k: str(v).encode("utf-8") for k,v in ldap_values.items()}
在添加值之前,我必须将它们转换为 UTF8。
因此,我将字典中的每个值都转换为字符串,还有列表!
当然,在此 'brilliant move of mine' 之后,将值添加到 ldap 时,列表将被视为字符串。
我一直忽略了这条线。
我想在 ldap 中为用户添加多个电子邮件地址。因此,当我 search/find 一个使用 ldapsearch 的特定用户时,一个名为 mailLocalAdress 的属性看起来像这样:
mailLocalAddress: abc@testing.com
mailLocalAddress: abcd@testing.com
mailLocalAddress: abcdefg@testing.com
我正在使用 python 3,ldap3 库,这就是我定义 mailLocalAdress 属性值的方式
ldap_values['mailLocalAddress'] = [user.email_first, user.email_second, user.email_third]
这是添加命令
ldap_con.add(dn, object_class, ldap_values)
我在执行 ldapsearch 时得到了这个结果
mailLocalAddress: ['abc@testing.com', 'abcd@testing.com', 'abcdefg@testing.com']
关于如何获得上面的列表的任何想法?
我无法重现您报告的行为。如果我从我的 ldap 目录开始:
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: example
dc: example
dn: ou=people,dc=example,dc=com
objectclass: organizationalunit
ou: people
然后运行以下Python代码:
>>> from ldap3 import Server, Connection, ALL
>>> server=Server('localhost')
>>> conn = Connection(server, user='cn=manager,dc=example,dc=com', password='secret')
>>> conn.bind()
True
>>> dn='uid=alice,ou=people,dc=example,dc=com'
>>> object_class=['person', 'organizationalperson', 'inetorgperson', 'inetlocalmailrecipient']
>>> ldap_values={'sn': 'example', 'cn': 'alice example', 'mailLocalAddress': ['alice@example.com', 'alice.example@example.com']}
>>> conn.add(dn, object_class, ldap_values)
True
>>>
一个ldapsearch
returns:
/etc/openldap # ldapsearch ... -b dc=example,dc=com uid=alice
# alice, people, example.com
dn: uid=alice,ou=people,dc=example,dc=com
sn: example
cn: alice example
mailLocalAddress: alice@example.com
mailLocalAddress: alice.example@example.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
uid: alice
这似乎正是您想要的。
这是一个完全不同的问题:
ldap_values = {k: str(v).encode("utf-8") for k,v in ldap_values.items()}
在添加值之前,我必须将它们转换为 UTF8。 因此,我将字典中的每个值都转换为字符串,还有列表! 当然,在此 'brilliant move of mine' 之后,将值添加到 ldap 时,列表将被视为字符串。 我一直忽略了这条线。