还是以上一篇文章中的目录结构为例:

图一
一、新加一个entry的处理
新加一个entry有两种处理方式,一种是直接操作数据库,一种是通过LDAP客户端是实现。
1.直接操作数据库的方法:
每新增一个entry,都应该在两个表格中添加数据:
1) 在相应自定义表格中增加一行,记录对象的各属性值。
2) 在ldap_entries中增加一行,记录entry的相关属性。
以图一所示的结构为例,增加以下entry:
1) dc=wfi,dc=wfiqa,dc=com
2) ou=users,dc=wfi,dc=wfiqa,dc=com
3) uid=admin,ou=users,dc=wfi,dc=wfiqa,dc=com
4) uid=user1,ou=users,dc=wfi,dc=wfiqa,dc=com
下面详细讲解如何进行操作:
1) entry“dc=wfi,dc=wfiqa,dc=com”是Organization类的对象,因此在organization表格中添加以下内容:
Column
Row1
id
1
name
wfi
2) entry“ou=users,dc=wfi,dc=wfiqa,dc=com”是Organization Unit类的对象,因此在org_unit表格中添加以下内容:
Column
Row1
id
1
name
users
3) entry“uid=admin,ou=users,dc=wfi,dc=wfiqa,dc=com”和“uid=user1,ou=users,dc=wfi,dc=wfiqa,dc=com”是User类的对象,因此在users表格中添加以下内容:
Column
Row1
Row2
id
1
2
name_en
admin
user1
name_cn
管理员
用户1
password
adminpwd
Pwd1
administrator@test.com
User1@test.com
code
admincode
Code1
4) 在ldap_entries中加入entry信息:
本表是核心表格,存储所有entry的信息。每个entry都是一个对象。
以下是表格各个字段的详细介绍:
Column
Desc.
id
entry唯一标识
dn
entry的dn
oc_map_id
所属objectClass的唯一标识
parent
父节点entry的唯一标识
keyval
对应的自定义表格中,该对象的唯一标识。
把所有entry信息添加到表格中:
Column
id
dn
oc_map_id
parent
keyval
Row1
1
dc=wfi,dc=wfiqa,dc=com
3
1
Row2
2
ou=users,dc=wfi,dc=wfiqa,dc=com
1
1
1
Row3
3
uid=admin, ou=users, dc=wfi, dc=wfiqa
2
2
1
Row4
4
uid=user1, ou=users, dc=wfi, dc=wfiqa
2
2
2
2. 通过LDAP客户端实现增加entry:
使用LDAP客户端实现增加entry的原理是:
在数据库中存储在自定义表格中增加一个Object以及修改一个Attribute的SQL语句,当通过客户端增加entry时,LDAP会进行以下操作:
1) 根据该entry的objectClass属性确定其对象类;
2) 找到相应的新增Object的SQL语句来执行,在自定义表格中新增一行记录,并得到新增Object的ID;
3) 根据客户端输入的entry信息以及上个步骤得到的ID,在ldap_entries表中插入一行记录;
4) 执行修改Attribute的SQL语句,更新自定义表格中该Object的各个attribute。
2.1 增加Object的SQL语句:
增加Object的SQL语句存储在ldap_oc_mappings表的add_proc字段中,该SQL语句应能够在对应的自定义表格中新增一行记录,并且返回新增记录的唯一标识(ID)。
可以先编写一个存储过程/函数,满足上述功能。然后通过SQL语句调用存储过程/函数。
本例中编写了一个新增用户的函数,内容如下:
DELIMITER $$
DROP FUNCTION IF EXISTS `ldap `.`create_user` $$
CREATE DEFINER=`root`@`%` FUNCTION `create_user`() RETURNS int(11)
BEGIN
//从用户表中获取当前ID值,+1作为新对象的ID值
SELECT MAX(id)+1 INTO @newId
FROM users;
//新增用户记录
INSERT INTO users
VALUES(@newId,null,null,null,null,null);
//返回用户ID
return @newId;
END $$
DELIMITER ;
在ldap_oc_mappings表中“inetOrgPerson”类的add_proc字段中,SQL语句内容如下:
SELECT create_user()
2.2. 修改attribute的SQL语句:
增加attribute的SQL语句存储在ldap_attr_mappings表的add_proc字段中,该SQL语句应能够在对应的自定义表格修改相应属性值。
可以先编写一个存储过程/函数,满足上述功能。然后通过SQL语句调用存储过程/函数。
例如,更新一个用户的英文名称,在ldap_attr_mappings表中sn属性的add_proc中存储以下SQL语句:
update users set name_cn=? where id=?
二、删除一个entry的处理
删除一个entry也有两种处理方式,一种是直接操作数据库,一种是通过LDAP客户端是实现。
1. 通过数据库删除entry:
先删除对应自定义表格中的对象记录,然后删除ldap_entries表中相应的entry记录。3.1已经详细描述了表结构,此处不再赘述。
注:如果要删除的entry下面还有子entry,注意要先删除下面的子entry。
2. 通过LDAP客户端删除entry:
使用LDAP客户端实现删除entry的原理是:
在数据库中存储在自定义表格中删除一个Object的SQL语句,当通过客户端删除entry时,LDAP会进行以下操作:
1) 根据该entry的dn,在ldap_entries表中找到其对象类(oc_map_id),以及该对象的ID(keyval);
2) 找到相应的删除Object的SQL语句来执行,在自定义表格中删除相应的对象记录;
3) 从ldap_entries表中删除相应的entry记录。
删除一个Object的SQL语句存储在ldap_oc_mappings表的delete_proc字段中。详细的内容可参考“2.通过LDAP客户端实现增加entry”。
三、修改或删除一个attribute的处理
其实删除attribute的操作只不过是将attribute的值清空(修改为空字符串),所以等同于修改attribute值。
1. 通过数据库操作来修改attribute:
直接在对应的自定义表格中修改字段值即可。
2. 通过LDAP客户端来修改:
原理不再赘述。
将修改属性值的SQL语句存储到ldap_attr_mappings表的add_proc字段中,将修改属性值为空字符串的SQL语句存储到ldap_attr_mappings表的delete_proc字段中。
可参考“2.2. 修改attribute的SQL语句”.。
四、本例中没有提到的几个系统表格:
在本次示例中,有几个系统表格没有使用到。
ldap_entry_objectclass
当一个entry对应多个object时,此表用来记录对应关系。曾看到一个资料说,如果此表内容为空,某处的操作会出错(具体是什么操作给忘记了),所以建议往这张表里插入至少一条记录,无论正确与否。
Column
Desc.
entry_id
ldap_entries表中对应entry的ID
oc_name
objectclass name
2 ldap_referrals
... something to do with referrals?
(此表在2.3版本后就没有了,但是因为本次实验是在2.2.29版本上进行,所以会有此表格。)
本文详述Windows环境下,结合OpenLDAP和MySQL进行LDAP数据的维护,包括新增、删除和修改entry,以及通过LDAP客户端操作的实现方法。涉及到的核心表格有ldap_entries、ldap_oc_mappings和ldap_attr_mappings,通过SQL语句和存储过程实现对象和属性的增删改。
——LDAP数据的维护&spm=1001.2101.3001.5002&articleId=114475657&d=1&t=3&u=4a12e99a066e43b58d6cb4f036c7d433)
2592

被折叠的 条评论
为什么被折叠?



