由于OpenLDAP本身提供的属性有限,不能满足每个个性化需求,所有需要对属性进行自定义扩展。
根据LDAP知晓,添加自定义属性需要添加对应的objectClass和AttributeType,即属性对象和该属性所拥有的属性类型。
方法:通过编写schema扩展自定义属性
参考文献:https://www.openldap.org/devel/admin/schema.html
第一步:定义schema
定义一个schema文件分为五步:
- 获取对象标识符
- 选择一个名字前缀
- 创建本地架构文件
- 定义自定义属性类型(如有必要)
- 定义自定义对象类
1. 获取对象标识符
每个schema元素均有全局唯一标识 对象标识符(OID)。基本OID类似于1.3.6.1.4.1.X,其中X是整数。
2. 选择一个名字前缀
除了为每个schema元素分配唯一的对象标识符之外,还应该为每个元素至少提供一个文本名称。
3. 创建本地schema文件
本地创建的schema文件应当添加到import.conf文件中,以便openLDAP可以找到该文件。
#工作目录不确定,所以使用绝对路径指定Schema
# /etc/ldap/schema 为ldap的安装目录,自带以下五个schema文件
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/ppolicy.schema
#schema文件会挂载在/tmp/schema路径下
#该文件为新增的自定义文件
include /tmp/schema/ldap.schema
4. 定义自定义属性类型(如有必要)
常用语法:
| Name | OID | Description |
|---|---|---|
| boolean | 1.3.6.1.4.1.1466.115.121.1.7 | boolean value |
| directoryString | 1.3.6.1.4.1.1466.115.121.1.15 | Unicode (UTF-8) string |
| distinguishedName | 1.3.6.1.4.1.1466.115.121.1.12 | LDAP DN |
| integer | 1.3.6.1.4.1.1466.115.121.1.27 | integer |
| numericString | 1.3.6.1.4.1.1466.115.121.1.36 | numeric string |
| OID | 1.3.6.1.4.1.1466.115.121.1.38 | object identifier |
| octetString | 1.3.6.1.4.1.1466.115.121.1.40 | arbitrary octets |
常用匹配规则:
| Name | Type | Description |
|---|---|---|
| booleanMatch | equality | boolean |
| caseIgnoreMatch | equality | case insensitive, space insensitive |
| caseIgnoreOrderingMatch | ordering | case insensitive, space insensitive |
| caseIgnoreSubstringsMatch | substrings | case insensitive, space insensitive |
| caseExactMatch | equality | case sensitive, space insensitive |
| caseExactOrderingMatch | ordering | case sensitive, space insensitive |
| caseExactSubstringsMatch | substrings | case sensitive, space insensitive |
| distinguishedNameMatch | equality | distinguished name |
| integerMatch | equality | integer |
| integerOrderingMatch | ordering | integer |
| numericStringMatch | equality | numerical |
| numericStringOrderingMatch | ordering | numerical |
| numericStringSubstringsMatch | substrings | numerical |
| octetStringMatch | equality | octet string |
| octetStringOrderingMatch | ordering | octet string |
| octetStringSubstringsMatch | ordering | octet st ring |
| objectIdentiferMatch | equality | object identifier |
定义格式例如:
attributetype (
2.2.2.1.1
NAME 'unitId'
DESC '单位ID'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
EQUALITY caseIgnoreMatch
SINGLE-VALUE )
5. 定义自定义对象类
该对象类指令用来定义一个新的对象类。定义如下:
objectClass (
2.5.6.45
NAME 'job'
DESC 'Job'
SUP organizationalRole STRUCTURAL
MUST ( jobId $ unitId $ isManager $ levelOrder $ levelTitle )
)
详细定义规则请参考上方参考文献。
本文定义ldap.schema内容为:
attributetype (
2.2.2.1.1
NAME 'unitId'
DESC '单位ID'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
EQUALITY caseIgnoreMatch
SINGLE-VALUE )
attributetype (
2.2.2.1.2
NAME 'jobId'
DESC '岗位ID'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
EQUALITY caseIgnoreMatch
SINGLE-VALUE )
attributetype (
2.2.2.1.4
NAME 'isExpert'
DESC '是否专家'
EQUALITY booleanMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
)
attributetype (
2.2.2.1.8
NAME 'levelTitle'
DESC '职位名称'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
attributetype (
2.2.2.1.9
NAME 'levelOrder'
DESC '职位等级, 数字越小级别越高'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
)
attributetype (
2.2.2.1.10
NAME 'roleName'
DESC '用户角色名称'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
# unit
objectClass (
2.5.6.44
NAME 'unit'
DESC 'Unit'
SUP organizationalUnit STRUCTURAL
MUST unitId
)
# jobs
objectClass (
2.5.6.45
NAME 'job'
DESC 'Job'
SUP organizationalRole STRUCTURAL
MUST ( jobId $ unitId $ isManager $ levelOrder $ levelTitle )
)
# user
objectClass (
2.5.6.46
NAME 'user'
DESC 'User'
SUP iNetOrgPerson STRUCTURAL
MAY ( jobId $ isExpert $ expertType $ expertMajor $ rtxCode $ roleName )
)
# role
objectClass (
2.5.6.47
NAME 'role'
DESC 'Role'
SUP organizationalRole STRUCTURAL
MUST roleName
)
第二步:将schema文件转为ldif文件
桌面新建一个文件夹aaa,添加两个文件ldap.schema和import.conf
指定命令slaptest -f import.conf -F . 将在该文件夹下常见一个目录cn=config ,进入该目录下的cn=schema 会看到6个ldif文件,最后一个就是我们新添加的。但是该文件有许多不需要的内容,需要对它进行修改。
在aaa下创建aa文件夹,复制ldap.chema文件到aa文件下,
在aaa文件夹中新建run.sh文件
valid_ldifs=""
cd /home/xiao/桌面/aaa/cn=config/cn=schema
for ldif in `ls ./*.ldif`
do
ldif_name=`basename $ldif`
#ldif_name=${ldif_name#cn=\{[0-9]*\}}
ldif_name=${ldif_name#*\}}
ldif_name=${ldif_name%".ldif"}
rel_schema_file=/home/xiao/桌面/aaa/aa/${ldif_name}.schema
if [ -f $rel_schema_file ]; then
valid_ldifs="${valid_ldifs} ${ldif}"
fi
done
for ldif in ${valid_ldifs}
do
ldif_name=`basename $ldif`
ldif_name=${ldif_name#cn=\{[0-9]*\}}
ldif_name=${ldif_name%".ldif"}
final_file=/home/xiao/桌面/aaa/$ldif_name.ldif
echo "dn: cn=${ldif_name},cn=schema,cn=config" >> $final_file
echo "cn: ${ldif_name}" >> $final_file
cat $ldif \
| grep -v "#" \
| grep -v "structuralObjectClass" \
| grep -v "entryUUID" \
| grep -v "creatorsName" \
| grep -v "createTimestamp" \
| grep -v "entryCSN" \
| grep -v "modifiersName" \
| grep -v "modifyTimestamp" \
| grep -v "dn: " \
| grep -v "cn: " \
>> $final_file
done
这样就可以生成我们需要的ldif文件ldap.ldif
dn: cn=ldap,cn=schema,cn=config
cn: ldap
objectClass: olcSchemaConfig
olcAttributeTypes:: ezB9KCAyLjIuMi4xLjEgTkFNRSAndW5pdElkJyBERVNDICfljZXkvY1J
RCcgRVFVQUxJVFkgY2FzZUlnbm9yZU1hdGNoIFNZTlRBWCAxLjMuNi4xLjQuMS4xNDY2LjExNS4
xMjEuMS4xNSBTSU5HTEUtVkFMVUUgKQ==
olcAttributeTypes:: ezF9KCAyLjIuMi4xLjIgTkFNRSAnam9iSWQnIERFU0MgJ+Wyl+S9jUlE
JyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4xLjE0NjYuMTE1LjE
yMS4xLjE1IFNJTkdMRS1WQUxVRSAp
olcAttributeTypes:: ezJ9KCAyLjIuMi4xLjMgTkFNRSAnaXNNYW5hZ2VyJyBERVNDICfmmK/l
kKbmiYDlsZ7ljZXkvY3lhoXnmoTpooblr7wnIEVRVUFMSVRZIGJvb2xlYW5NYXRjaCBTWU5UQVg
gMS4zLjYuMS40LjEuMTQ2Ni4xMTUuMTIxLjEuNyAp
olcAttributeTypes:: ezN9KCAyLjIuMi4xLjQgTkFNRSAnaXNFeHBlcnQnIERFU0MgJ+aYr+WQ
puS4k+WuticgRVFVQUxJVFkgYm9vbGVhbk1hdGNoIFNZTlRBWCAxLjMuNi4xLjQuMS4xNDY2LjE
xNS4xMjEuMS43ICk=
olcAttributeTypes:: ezR9KCAyLjIuMi4xLjUgTkFNRSAnZXhwZXJ0VHlwZScgREVTQyAn5LiT
5a6257G75Z6LJyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4xLjE
0NjYuMTE1LjEyMS4xLjE1ICk=
olcAttributeTypes:: ezV9KCAyLjIuMi4xLjYgTkFNRSAnZXhwZXJ0TWFqb3InIERFU0MgJ+S4
k+WutuS4k+S4micgRVFVQUxJVFkgY2FzZUlnbm9yZU1hdGNoIFNZTlRBWCAxLjMuNi4xLjQuMS4
xNDY2LjExNS4xMjEuMS4xNSAp
olcAttributeTypes:: ezZ9KCAyLjIuMi4xLjcgTkFNRSAncnR4Q29kZScgREVTQyAn6IW+6K6v
6YCa5qCH6K+G56CBJyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4
xLjE0NjYuMTE1LjEyMS4xLjE1ICk=
olcAttributeTypes:: ezd9KCAyLjIuMi4xLjggTkFNRSAnbGV2ZWxUaXRsZScgREVTQyAn6IGM
5L2N5ZCN56ewJyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4xLjE
0NjYuMTE1LjEyMS4xLjE1ICk=
olcAttributeTypes:: ezh9KCAyLjIuMi4xLjkgTkFNRSAnbGV2ZWxPcmRlcicgREVTQyAn6IGM
5L2N562J57qnLCDmlbDlrZfotorlsI/nuqfliKvotorpq5gnIEVRVUFMSVRZIGludGVnZXJNYXR
jaCBTWU5UQVggMS4zLjYuMS40LjEuMTQ2Ni4xMTUuMTIxLjEuMjcgKQ==
olcAttributeTypes:: ezl9KCAyLjIuMi4xLjEwIE5BTUUgJ3JvbGVJZCcgREVTQyAn55So5oi3
6KeS6ImyaWQnIEVRVUFMSVRZIGNhc2VJZ25vcmVNYXRjaCBTWU5UQVggMS4zLjYuMS40LjEuMTQ
2Ni4xMTUuMTIxLjEuMTUgKQ==
olcObjectClasses: {0}( 2.5.6.44 NAME 'unit' DESC 'Unit' SUP organizationalUn
it STRUCTURAL MUST unitId )
olcObjectClasses: {1}( 2.5.6.45 NAME 'job' DESC 'Job' SUP organizationalRole
STRUCTURAL MUST ( jobId $ unitId $ isManager $ levelOrder $ levelTitle ) )
olcObjectClasses: {2}( 2.5.6.46 NAME 'user' DESC 'User' SUP iNetOrgPerson ST
RUCTURAL MAY ( jobId $ isExpert $ expertType $ expertMajor $ rtxCode ) )
olcObjectClasses: {3}( 2.5.6.47 NAME 'role' DESC 'Role' SUP organizationalRo
le STRUCTURAL MUST roleId )
第三步:执行ldif文件
输入命令ldap -Y EXTERNAL -H ldapi:/// -f ldap.ldif
第四步:打开Apache Directory Studio验证

打开Schema Browser 在Object Class 中搜索添加的属性unit job 等,在Attribute Type 中搜索 roleName 等,都存在说明已经添加成功了。
版权声明:本文为qq_33017507原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。