仍是以上一篇文章中的目錄結構爲例:數據庫
圖一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 |
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版本上進行,因此會有此表格。)