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

相關文章
相關標籤/搜索