如何使用 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 年前分崩离析的合资企业的产品。)
我正在用 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 年前分崩离析的合资企业的产品。)