如何使用 C 语言的 openLDAP 库 API 以编程方式修改现有的 Open LDAP 对象类?

How to Programmatically modify an existing Open LDAP objectclass using openLDAP library APIs for C language?

我正在用 C 编程语言编写身份和访问管理应用程序。所以我使用 openLDAP 来保存用户详细信息,它提供了一组 API 来执行绑定、添加、搜索、修改等操作。我创建了一个新对象 class 来保存我的应用程序的用户详细信息,如下所示,

attributetype ( 2.5.4.1 NAME 'id'
    DESC 'RFC2256: user identifier'
    EQUALITY caseIgnoreMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

attributetype ( 2.5.4.2 NAME 'name'
    DESC 'RFC2256: user name'
    EQUALITY caseIgnoreMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

attributetype ( 2.5.4.3 NAME 'email'
    DESC 'RFC2256: user mail address'
    EQUALITY caseIgnoreMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )


objectclass ( 2.5.4.4 NAME 'user'
    DESC 'user details'
    SUP top STRUCTURAL
    MUST id
    MAY ( name $ email ) )

是否可以在不直接编辑模式文件而是使用 openLDAP 库提供的 API 的情况下向 'user' 对象 class 添加新属性 'phoneNumber'?

最佳做法是添加一个没有必需属性的辅助对象Class,并根据需要添加 "MAY" 属性。

将 AUX class 添加到架构后,您可以通过修改操作将 AUX Class 添加到任何结构对象 Class 条目作为对象 Class 所需的值。

这使您可以完整地维护基础架构。

-吉姆

不是您要求的。但这很重要,所以其他人不要天真地复制粘贴:

attributetype ( 2.5.4.*

[..]

objectclass ( 2.5.4.4 NAME 'user'

您正在滥用已分配给其他架构描述的 OID。这已破了。您将无法加载任何数据。

使用 OpenLDAP 的动态配置,如果您遵循 RFC 4512 中用于定义属性类型和对象的规则 add/modify,您可以动态地 add/modify 架构 类。

另请参阅:cn=schema

请注意,删除模式描述以防已有数据在使用它是一个禁忌。

LDAP 标准是为架构写入一次读取许多数据而编写的 - 一旦设置了某些内容,就无法取消设置。因此,许多 LDAP 服务器都非常抗拒像您所说的那样更改其模式元素。

当然,对于我们中的许多人来说,这种态度是我们负担不起的学术奢侈品,所以我们确实改变了我们的架构,尽管它让我们感到多么恐惧LDAP 供应商。

但是,我们更改了我们的 架构,而不是标准架构。更改标准对象类是一个禁忌,因为有时当您更新 LDAP 服务器软件时,您对默认标准所做的任何更改都会在没有警告的情况下消失。即使限制自己编辑属于您的对象类,您仍然可能必须直接更新架构文件,然后让 ldap 服务器加载新文件,而不是仅仅要求它很好地更新其架构元素。

当然,不同的LDAP服务器对此有不同程度的烦躁。例如,当我们使用 iPlanet LDAP 时,如果我没记错的话,它会让我们删除和添加一个未使用的对象类,并像那样对其进行更改。 (不要使用 iPlanet LDAP;它是 15 年前分崩离析的合资企业的产品。)