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

时间:2018-05-23 06:46:09

标签: c ldap openldap ldif

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

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

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

3 个答案:

答案 0 :(得分:1)

最佳做法是添加一个没有REQUIRED属性的辅助ObjectClass,并根据需要添加“MAY”属性。

将AUX类添加到Schema后,您可以根据需要将AUX类添加到任何Structural ObjectClass条目作为ObjectClass值进行修改操作。

这使您可以保持基本模式的完整。

-Jim

答案 1 :(得分:0)

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

  

属性类型(2.5.4。*

     

[..]

     

objectclass(2.5.4.4 NAME'user'

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

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

另请参阅:cn=schema

请注意,如果已经存在使用它的数据,则删除模式描述是不可以的。

答案 2 :(得分:0)

为Schema编写LDAP标准,使其成为“一次写入多次读取”数据-一旦设置了内容,就无法取消设置。结果,许多LDAP服务器都很难像您所说的那样更改其架构元素。

当然,对于我们许多人来说,这种态度是我们无法负担的学术上的奢侈,因此我们要做对其架构进行更改,尽管它使LDAP供应商感到震惊。

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

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