将用户添加到OpenLDAP中的POSIX或“ memberOf”组中

时间:2019-08-19 17:51:56

标签: python ldap3

我正在使用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]])

1 个答案:

答案 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])]})