Windows+OpenLDAP+MySQL配置及使用详解(三)——LDAP数据的维护

仍是以上一篇文章中的目录结构为例:数据库

image

图一app

 

1、新加一个entry的处理函数

新加一个entry有两种处理方式,一种是直接操做数据库,一种是经过LDAP客户端是实现。ui

1.直接操做数据库的方法:spa

每新增一个entry,都应该在两个表格中添加数据:.net

1) 在相应自定义表格中增长一行,记录对象的各属性值。code

2) 在ldap_entries中增长一行,记录entry的相关属性。对象

以图一所示的结构为例,增长如下entry:ci

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

email

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=?

 

2、删除一个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”。

 

3、修改或删除一个attribute的处理

其实删除attribute的操做只不过是将attribute的值清空(修改成空字符串),因此等同于修改attribute值。

1. 经过数据库操做来修改attribute:

直接在对应的自定义表格中修改字段值便可。

2. 经过LDAP客户端来修改:

原理再也不赘述。

将修改属性值的SQL语句存储到ldap_attr_mappings表的add_proc字段中,将修改属性值为空字符串的SQL语句存储到ldap_attr_mappings表的delete_proc字段中。

可参考“2.2. 修改attribute的SQL语句”.。

4、本例中没有提到的几个系统表格:

在本次示例中,有几个系统表格没有使用到。

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版本上进行,因此会有此表格。)

相关文章
相关标签/搜索