You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展OpenLDAP的person类以添加userPrincipalName属性?

解决OpenLDAP扩展person类添加userPrincipalName属性的问题

方法一:创建辅助对象类(测试环境首选,操作简单)

测试环境无需严格遵循标准,通过创建辅助对象类来承载userPrincipalName属性,用户条目只需额外继承这个类即可使用该属性,无需修改核心schema。

  1. 编写定义辅助类的LDIF文件(比如ad_user_aux.ldif):

    dn: cn=ad-user-aux,cn=schema,cn=config
    objectClass: olcSchemaConfig
    cn: ad-user-aux
    # 若已通过user_attr.ldif定义过userPrincipalName,可删除下面这行
    olcAttributeTypes: ( 1.3.6.1.4.1.9999.1.1.1.10 NAME 'userPrincipalName' DESC 'User Principal Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
    # 定义辅助对象类,允许包含userPrincipalName属性
    olcObjectClasses: ( 1.3.6.1.4.1.9999.1.2.1.1 NAME 'adUserAux' DESC 'Auxiliary class for AD-like user attrs' SUP top AUXILIARY MAY ( userPrincipalName ) )
    

    注:1.3.6.1.4.1.9999是私有测试OID,可随意使用。

  2. 加载这个LDIF到OpenLDAP容器:
    替换<容器名>和<管理员密码>为你的实际信息:

    docker exec -it <你的OpenLDAP容器名> ldapadd -x -D cn=admin,dc=foo,dc=bar -w <管理员密码> -f /path/to/ad_user_aux.ldif
    

    若通过slapd-init.sh初始化,直接把这条命令加到脚本里,和之前的user_attr.ldif加载命令放在一起即可。

  3. 修改用户条目LDIF,添加辅助类:
    在你的用户定义里新增一行objectClass: adUserAux,修改后如下:

    dn: cn=Amy Wong+sn=Kroker,ou=_employees,DC=foo,DC=bar
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: InetOrgPerson
    objectClass: adUserAux  # 新增这行
    cn: Amy Wong
    sn: Kroker
    memberOf: CN=some_group,OU=_Groups,DC=foo,DC=bar
    userPrincipalName: amy@planetexpress.com
    userPassword:: e1NTSEF9d0p2OXMyWjltMGJTMFIxV1k3QjdCRWZEVVZPQzg2Y3BWL3VDMHc9PQ==
    

    现在再添加这个用户就不会报属性不允许的错误了。

方法二:修改organizationalPerson核心对象类(贴近AD结构)

如果想让organizationalPerson类本身支持userPrincipalName,可直接修改核心schema(仅测试环境建议操作,生产环境不推荐):

  1. 查看当前organizationalPerson的定义,确认原有属性列表:

    docker exec -it <你的OpenLDAP容器名> ldapsearch -x -D cn=admin,dc=foo,dc=bar -w <管理员密码> -b cn=schema,cn=config "(cn=core)" olcObjectClasses | grep -A 15 "organizationalPerson"
    

    会得到类似输出(需保留原有所有属性):

    olcObjectClasses: ( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )
    
  2. 编写修改schema的LDIF文件(比如modify_org_person.ldif):
    在原有MAY属性列表末尾加上$ userPrincipalName,完整内容如下:

    dn: cn=core,cn=schema,cn=config
    changetype: modify
    replace: olcObjectClasses
    olcObjectClasses: ( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ userPrincipalName ) )
    
  3. 应用修改:

    docker exec -it <你的OpenLDAP容器名> ldapmodify -x -D cn=admin,dc=foo,dc=bar -w <管理员密码> -f /path/to/modify_org_person.ldif
    

    修改完成后,所有继承organizationalPerson的用户条目都可直接使用userPrincipalName属性,无需额外添加对象类。


内容的提问来源于stack exchange,提问作者A. Neumann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:50:40