0

我正在使用 Pythonldap3模块来处理 OpenLDAP 服务器。我已经能够查询用户并将用户添加到 OU,但不知道如何将用户添加到组(POSIX 和 memberOf/groupOfNames 覆盖)。我在这里找到了一种 Active Directory 的“方式”,但我如何将该示例用于 OpenLDAP?甚至不确定from ldap3 import Server, Connection, ALL, NTLM是否在 Linux 上。

尝试下面的代码。用户被添加到目录中,但添加到POSIXldap-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/pythonldap3包中吗?尝试显式导入它。

   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]])
4

1 回答 1

0

对于遇到此问题的其他人,我必须先添加MODIFY_ADD到我的 ldap3 导入。然后conn.modify()按照@larsks(下面的修改代码)的建议使用将用户添加到 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])]})
于 2019-08-20T15:02:34.577 回答