我正在使用Python ldap3
模块与OpenLDAP服务器一起使用。我已经能够查询用户并将其添加到OU,但是无法确定如何将用户添加到组(POSIX和memberOf / groupOfNames覆盖)。我找到了执行此操作的Active Directory here的“方法”,但是如何使该示例适合OpenLDAP?甚至不确定from ldap3 import Server, Connection, ALL, NTLM
在Linux上是否有用。
尝试以下代码。用户已添加到目录中,但添加到 POSIX 组ldap-users
失败,并出现一系列错误,但这看起来像是罪魁祸首。不知道我搞砸了objectClass属性:
LDAPInvalidAttributeSyntaxResult - 21 - invalidAttributeSyntax - None - objectClass: value #0 invalid per syntax
我以为我会留待 POSIX 组供以后使用,并尝试 memberOf 叠加层(将用户添加到admins
groupOfNames 对象),但我只能用
ImportError: No module named 'ldap3.modlist'
不确定模块ldap3.modlist
为何不可用。 Ubuntu / python ldap3
软件包中不应该包含吗?尝试显式导入。
import ldap3.modlist as modlist
import json
import urllib.request
from urllib.error import URLError, HTTPError
import getopt, sys, logging
from ldap3 import Server, Connection, ALL
...
# retrieve user details from HR database
ldap_user = PersonFromHRDB(person_id)
# fill in the template of attributes we need to give to the ldap server
attributes = { 'givenName': ldap_user.givenName,
'sn': ldap_user.sn,
'displayName': ldap_user.displayName,
'uid': ldap_user.uidNumber,
'homeDirectory': ldap_user.homeDirectory,
...}
# add user to DIT via their dn (dn:uid=user101,ou=people,dc=my,dc=dom)
conn.add(ldap_user.dn, ['posixAccount', 'top', 'inetOrgPerson', 'shadowAccount'], attributes)
# add user to a the 'ldap-users' POSIX group
conn.add('cn=ldap-users,ou=groups,dc=my,dc=dom', {'memberUid': ldap_user.cn})
# add user to 'admins' groupOfNames (memberOf overlay) object
group_dn = 'cn=admins,ou=groups,dc=my,dc=dom'
conn.modify_s (group_dn, [ modlist.MOD_ADD, 'member', [ldap_user.dn]])
答案 0 :(得分:0)
对于遇到此问题的其他人,我必须先将MODIFY_ADD
添加到我的ldap3导入中。然后按照@larsks的建议使用conn.modify()
(下面的修改代码)将用户添加到openLDAP组。
将用户添加到POSIX
组与memberOf
叠加层中基本上是相同的功能,但是属性和用户值不同。 POSIX
组使用memberUid
属性和用户CN
值,而memberOf
覆盖图使用member
属性以及完整的DN:
用户。
此外,如果用户已经存在于组中并且尝试添加,conn.modify()
也会弹出,因此,必须首先检查用户是否已经存在。
import ldap3.modlist as modlist
import json
import urllib.request
from urllib.error import URLError, HTTPError
import getopt, sys, logging
from ldap3 import Server, Connection, ALL, MODIFY_REPLACE, MODIFY_ADD, MODIFY_DELETE
...
# retrieve user details from HR database
ldap_user = PersonFromHRDB(person_id)
# fill in the template of attributes we need to give to the ldap server
attributes = { 'givenName': ldap_user.givenName,
'sn': ldap_user.sn,
'displayName': ldap_user.displayName,
'uid': ldap_user.uidNumber,
'homeDirectory': ldap_user.homeDirectory,
...}
# add user to DIT via their dn (dn:uid=user101,ou=people,dc=my,dc=dom)
conn.add(ldap_user.dn, ['posixAccount', 'top', 'inetOrgPerson', 'shadowAccount'], attributes)
group_dn = 'cn=ldap-users,ou=groups,dc=my,dc=dom'
# default to POSIX attributes/values
attribute = 'memberUid'
user_value = ldap_user.cn
if my_userExistsInGroup (ldap_user, group_dn) is False:
# adjust for memberOf
if my_isPosixGroup (group_dn) is False:
attribute = 'member'
user_value = ldap_user.dn
conn.modify(group_dn, {attribute: [(MODIFY_ADD, [user_value])]})