如何扩展OpenLDAP的person类以添加userPrincipalName属性?
解决OpenLDAP扩展person类添加userPrincipalName属性的问题
方法一:创建辅助对象类(测试环境首选,操作简单)
测试环境无需严格遵循标准,通过创建辅助对象类来承载userPrincipalName属性,用户条目只需额外继承这个类即可使用该属性,无需修改核心schema。
编写定义辅助类的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,可随意使用。加载这个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加载命令放在一起即可。修改用户条目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(仅测试环境建议操作,生产环境不推荐):
查看当前
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 ) )编写修改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 ) )应用修改:
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
相关产品推荐
相关产品推荐

