LDAP gidNumber,如Auto Integer

时间:2014-08-29 14:34:14

标签: python django active-directory ldap openldap

仍在使用LDAP ...
我今天提交的问题是这样的:我正在使用Django框架在python中开发的自定义方法在服务器LDAP上创建一个posixGroup。我附上下面的方法代码。
主要问题是属性 gidNumber是posixGroup类的强制,但在使用像phpLDAPadmin这样的图形化LDAP客户端时通常不需要,因为它们会自动填充此字段自动整数 这里的问题是: gidNumber是默认的自动整数属性,还是只使用上面引用的客户端?我必须在创建posixGroup条目期间指定它吗?

def ldap_cn_entry(self):

        import ldap.modlist as modlist

        dn = u"cn=myGroupName,ou=plant,dc=ldap,dc=dem2m,dc=it"

        # A dict to help build the "body" of the object
        attrs = {}
        attrs['objectclass'] = ['posixGroup']
        attrs['cn'] = 'myGroupName'
        attrs['gidNumber'] = '508'

        # Convert our dict to nice syntax for the add-function using modlist-module
        ldif = modlist.addModlist(attrs)

        # Do the actual synchronous add-operation to the ldapserver
        self.connector.add_s(dn, ldif)
  • connector首先在构建此方法的类的构造函数中实例化。构造函数还提供LDAP初始化和绑定。然后,连接将被析构函数关闭。
  • 使用方法我开始实例化它所属的类,因此它也连接到LDAP服务器。比我使用该方法,最后我销毁实例之前的对象关闭连接。 实际上,如果使用此过程创建不同的条目,或者我手动指定gidNumber ,则一切正常。
    事实是,我无法在任何时候创建一个团队来指定gidNumber来实现我的目标。我应该自动填写(如果可能)或考虑另一种方法来完成它。

我没有发布更多关于我没有在页面上进行的课程的代码 如果需要,我会提供更多信息。谢谢。

2 个答案:

答案 0 :(得分:1)

LDAP协议没有自动整数的方法。

您需要在创建条目时指定值。

你可以做一些技巧来帮助你。 我们经常将最后使用的值放在OU上(我们在OU中添加一个带有自定义属性的AUX类),然后在使用gidNumber时读取,递增然后使用该值。

Found this described。 -Jim

答案 1 :(得分:1)

按照@jeemster的建议,我找到了管理gidNumber的方法。

所有的拳头:我在我的LDAP上创建了一个名为“gidNumber”的新条目,我添加了可选属性 description 以包含我使用的最后一个gidNumber(类:organizationalUnit,ou:gidNumber,description :500)。

然后我创建了以下功能:

def ldap_gid_finder(self):

        # Locates the suport-entry with a simple query
        self.baseDN = "ou=impianti,dc=ldap,dc=dem2m,dc=it"
        self.searchScope = ldap.SCOPE_SUBTREE
        self.retrieveAttributes = None
        self.searchFilter = "ou=*gidNumber*"

        # Results are putted in a dictionary
        self.ldap_result = self.connector.search(
            self.baseDN, self.searchScope, self.searchFilter, self.retrieveAttributes)
        result_set = []
        while 1:
            result_type, result_data = self.connector.result(self.ldap_result, 0)
            if (result_data == []):
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    result_set.append(result_data)

        # The attribute containing gidNumber is passed to an instanced variable
        self.actual_gid_number = int(result_set[0][0][1]['description'][0])

    # Provides to gidNumber incrementation
    def ldap_gid_increment(self):

        dn = "ou=gidNumber,ou=impianti,dc=ldap,dc=dem2m,dc=it"

        old = {'description': str(self.actual_gid_number)}
        new = {'description': str(self.actual_gid_number + 1)}

        ldif = modlist.modifyModlist(old,new)

        self.connector.modify_s(dn, ldif)

上面我很遗憾,这些方法是在一个类中定义的,我覆盖了构造函数和析构函数,以便在实例化或删除实例时自动绑定/取消绑定到LDAP服务器。

然后,我在LDAP上使用查询来查找名为 gidNumber 的对象(我之前创建的ou),然后我用字典填充结果信息。在字典中,我找到了代表gidNumber的变量,我使用整数转换来操作它以进行递增。这就是全部。

这个程序我真的很高效,因为我服务器重新启动你不会丢失gidNumber信息!谢谢你,jeemster。