OpenLDAP,Windows,MySQL之初搭建
安裝OpenLDAP for Windows,mysql,
另附無博文連結http://huangdekai1.blog.163.com/blog/static/3057141620126134262357/
注意:ODBC資料來源與作業系統有很大的關係,ODBC必須裝32位的,否則OpenLDAP啟動會報錯,Native ERROR。
在64位Windows系統中,預設“資料來源(ODBC)”是64位的,包括“控制面板-》管理工具-》資料來源 ”或在“執行”中直接執行“ODBCAD32”程式。如果客戶端是32位應用程式,仍然需要配置32位ODBC資料來源,這時需要執行“C:\Windows\SysWOW64\odbcad32.exe”來啟動“ODBC資料來源管理器”,新增32位的ODBC資料來源。
slapd.exe -d 1 -f ./slapd.conf
LDAPBROWSER
為工作原因,需要在windows作業系統下,搭建openldap+mysql工具平臺。曾經嘗試在網上搜索相關的文章,但是openldap與DBMS連線的內容非常少,在windows作業系統下配置和使用的資料更是少之又少。所以只好查閱了許多零碎的參考資料,摸索了幾天,終於折騰成功。在這裡把詳細的過程記錄下來,希望能幫助有需要的朋友。
一、準備工作:
1、 安裝好OpenLDAP:
我使用的是openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe,網上很多地方提供下載,在windows下如何安裝的文章也很多。
先安裝配置好LDAP,確認能夠正常使用。
2、 安裝好MySQL:
我使用的是5.1.35版本。應該5.0版本以上都沒問題。
3、 從openldap官網下載原始碼包,裡面有需要用到的測試資料和配置樣例。最好是與安裝你安裝的OpenLDAP版本一致。本文下載的是openldap-2.2.29.tgz。解壓縮至本地目錄。
二、部署:
現在開始正式部署。
1、 安裝MYSQL的ODBC驅動:下載驅動程式,安裝即可(本文使用的是MyODBC-3.51.11-2-win.exe)。
2、 建立資料庫:
1) 建立一個空資料庫;
2) 在下載的原始碼包中找到servers/slapd/back-sql/rdbms_depend/mysql目錄,在MYSQL客戶端依次執行該目錄下的個SQL指令碼檔案:
testdb_create.sql testdb_data.sql backsql_create.sql //只有這個腳本里的內容是必須的,其他腳本里的都是測試資料。第一次配置時還是全部執行。 testdb_metadata.sql |
3、 建立一個可操作以上資料庫的賬戶,並設定密碼。
4、 建立ODBC資料來源,連線到以上資料庫。(開始選單-->設定-->控制面板-->管理工具-->資料來源(ODBC),詳細的就不介紹了)。
5、 修改ldap安裝目錄下的slapd.conf檔案,將配置檔案中BDB配置相關的程式碼全部刪除掉(就是從“database bdb”語句到最後的內容),新增以下程式碼:
####################################################################### # sql database definitions ####################################################################### database sql suffix "dc=example,dc=com" rootdn "cn=root,dc=example,dc=com" rootpw pwd dbname ldap //資料來源名稱,不是資料庫名稱。 dbuser user //資料庫使用者帳號 dbpasswd userpwd //資料庫使用者密碼 subtree_cond "ldap_entries.dn LIKE CONCAT(''%'',?)" insentry_query "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)" lastmod off has_ldapinfo_dn_ru no upper_func "upper" strcast_func "CONCAT" concat_pattern "?||?" |
6、 我這樣配置之後,無法啟動windows下的openldap服務,但是能通過在命令列視窗輸入命令:"slapd –d 1"來啟動服務。問題出在哪裡還沒搞清楚,暫時先通過命令列來啟動服務吧。
7、 啟動服務後,在命令列視窗輸入以下命令,如果能看到測試資料的內容,則表示配置成功:
ldapsearch -LLL -s sub -b "dc=example,dc=com" "(objectClass=*)" |
大功告成,說明OpenLDAP已經能夠讀取資料庫裡的測試資料。
理解一下資料庫端的原理。
先將資料庫中的測試資料清除掉:
1、刪除原資料庫中所有表格;
2、在下載的原始碼包中找到servers/slapd/back-sql/rdbms_depend/mysql目錄,執行指令碼backsql_create.sql 。
本文將通過一個例子講解資料庫結構。假設我們的LDAP服務端目錄結構如下:
圖一
首先給大家看一下,相應資料庫結構:
圖二
由圖二看出,資料庫中包括系統表格和自定義表格。系統表格是必須建立的表格,即backsql_create.sql腳本里的內容;自定義表格是根據實際的LDAP entry目錄結構建立的相應的物件(Object)表,表格欄位對應該物件的屬性(Attribute)。
下面開始講解怎樣初始化資料庫資料,使其能儲存圖一中的目錄結構。
注:如果更改了系統表格中的資料,需要重啟ldap服務才能生效。
1. 新增自定義表格:
自定義表格主要目的是為了儲存同一類別的物件(object)資料,表格各個欄位定義了物件類(objectClass)的屬性。objectClass、object、attribute的概念都來自LDAP,下面都直接用英文表示,大家會比較清晰一些。
本例中,有如下objectClass:
DN |
objectClass |
dc=wfi,dc=wfiqa,dc=com |
organization(組織) |
ou=users |
organizationalUnit(組織內單元,本例中只有users這一個單元) |
uid=admin uid=user1 |
inetOrgPerson(組織使用者) |
一般情況下,每一個objectClass,我們為其建立一個自定義表格,每個欄位對應該物件類的一個屬性。根據上表,我們新建了organization,org_unit,users三個表,具體表結構參見圖一。
2 在系統表ldap_oc_mappings中加入objectClass資訊:
此表格中主要儲存objectClass和對應的自定義表格的對應關係。
以下是表格各欄位的詳細介紹:
Column |
Desc. |
id |
objectClass的唯一標識 |
name |
objectClass的名稱 |
keytbl |
對應的自定義表格名稱 |
keycol |
對應的自定義表格中關鍵字欄位名稱 |
create_proc |
新增一個object時使用的SQL語句 |
delete_proc |
刪除一個object時使用的SQL語句 |
expect_return |
執行新增或刪除object的SQL語句,代表操作成果的SQL CODE值,通常是0。 |
下面是本例中,往本表新增的資料:
Column |
Row1 |
Row2 |
Row3 |
id |
1 |
2 |
3 |
Name |
organization |
organizationalUnit |
inetOrgPerson |
Keytbl |
organization |
org_unit |
users |
Keycol |
id |
id |
id |
create_proc |
(稍後再講) |
||
delete_proc |
(稍後再講) |
||
expect_return |
3 在系統表ldap_attr_mappings中加入attribute資訊:
此表格實際上就是建立LDAP中各attribute和資料庫中objectClass的各個屬性的關係。
此表格中sel_expr,from_tbls,join_where三個欄位主要儲存attribute如何通過SQL語句獲取。
例如:獲得某個attribute的SQL語句為:
SELECT CONCAT(a.column2,b.column2)
FROM a,b
WHERE a.column3=b.column1)
分別將SELECT,FROM,WHERE後面的語句儲存到這三個欄位裡。
另外,param_order欄位的含義目前還沒搞清楚,官網給出的例子裡,這個欄位的值都是3,所以這裡也都填3.
以下是表格各個欄位的詳細介紹:
Column |
Desc. |
id |
attribute唯一標識 |
oc_map_id |
所屬objectClass的唯一標識 |
name |
Attribute名稱 |
sel_expr |
SELECT後面的SQL語句 |
sel_expr_u |
不清楚用途,本例中沒有使用 |
from_tbls |
FROM後面的SQL語句 |
join_where |
WHERE後面的SQL語句 |
add_proc |
修改一個attribute值時使用的SQL語句 |
delete_proc |
刪除一個attribute值時使用的SQL語句 |
param_order |
不清楚含義,但官網給出的例子中,這個欄位的值全是3,所以本例中也將值設為3。 |
expect_return |
執行修改或刪除attribute值的SQL語句,代表操作成果的SQL CODE值,通常是0。 |
以下是本例中,往本表新增的資料:
Column |
Row1 |
Row2 |
Row3 |
Row4 |
Row5 |
Row6 |
Row7 |
id |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
oc_map_id |
1 |
2 |
3 |
3 |
3 |
3 |
3 |
name |
dc |
ou |
uid |
sn |
cn |
userPassword |
|
sel_expr |
name |
name |
code |
name_en |
name_cn |
password |
|
sel_expr_u |
|||||||
from_tbls |
organization |
org_unit |
users |
users |
users |
users |
users |
join_where |
|||||||
add_proc |
(稍後再講) |
||||||
delete_proc |
(稍後再講) |
||||||
param_order |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
expect_return |
完成上面的操作後,目錄結構的初始化工作完成。
目錄結構為例:
圖一
一、新加一個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 |
|
||
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?
相關推薦
OpenLDAP,Windows,MySQL之初搭建
安裝OpenLDAP for Windows,mysql, 另附無博文連結http://huangdekai1.blog.163.com/blog/static/3057141620126134262357/ 注意:ODBC資料來源與作業系統有很大的關係,ODBC必須裝32
Gitlab+Gerrit+Ldap+nginx+mysql 之Gerrit搭建與配置(一)
公司之前一直用gitlab來存放專案程式碼 ,目前因為業務需要(程式碼bug太多)需要引入gerrit來進行code review。 最初用的是centos 7.4,但是安裝完成後,GerritResource中沒有ALL_Project.git和All_Users.git生成,日誌中一直在報錯,反覆裝了幾
windows MySQL主從複製搭建
一、安裝Mysql 1.本地首先需要搭建一套mysql,可以使用整合環境。 2.需要單獨在搭建mysql,用來做主從複製 3.下載安裝太麻煩這裡可以直接複製phpStudy或者WAMP整合環境裡的MySQL 4.配置 mysql環境變數 ( 修改PATH,新增 D:\My
Web開發學習之路--Eclipse+Tomcat+mysql之初體驗
學習了一段時間android,正好要用到android和伺服器之間的互動,既然要學習android,那麼就涉獵下伺服器端的開發了,以前學過php,用thinkphp很快可以搭建起來,但是android是java的,web用java來寫不是更好,主要實現聊天的話得需要
mysql之 mysql 5.6不停機主從搭建(一主一從基於GTID復制)
從庫 creat 不停機 event rep ply copy from end 環境說明:版本 version 5.6.25-log 主庫ip: 10.219.24.25從庫ip:10.219.24.22os 版本: centos 6.7已安裝熱備軟件:xtrabacku
mysql之 mysql 5.6不停機雙主一從搭建(活躍雙主一從基於日誌點復制)
stat 5.6 create 文件夾 eat ima send spec tar 環境說明:版本 version 5.6.25-log 主1庫ip: 10.219.24.25主2庫ip: 10.219.24.22從1庫ip:10.219.24.26os 版本: cento
LAMP、LNMP實戰之四搭建mysql(持續更新)
export 加密 base yum exe root with pat debug LAMP、LNMP實戰之四搭建mysql說明:服務器192.168.2.32 數據庫版本mysql5.5.32 cmake版本2.8.8yum install -y g
mysql之windows忘記密碼
nbsp leg word -- roo host 服務 and grant 步驟: 1. 關閉mysql服務 2. mysqld --skip-grant-tables; 3. 新cmd,執行mysql 4. use mysql; 5. update mysql.use
MYSQL之讀寫分離搭建方案
讀寫分離實現:360 Atlas(代理層實現,無需修改應用程式程式碼) 實現步驟 # 安裝 shell> rpm -i Atlas-2.2.1.el6.x86_64.rpm # 解除安裝 shell> rpm -e Atlas-2.2
《深入淺出MySQL:資料庫開發、優化與管理維護(2nd)》第31章之MySQL非同步複製搭建學習筆記
MySQL的複製原理大致如下: (1)首先,MySQL主庫在事務提交時會把資料變更作為事件Events記錄在二進位制日誌檔案Binlog中;MySQL主庫上的sync_binlog引數控制Binlog日誌重新整理到磁碟。 (2)主庫推送二進位制日誌檔案Binlog中的事件到從庫的中繼日誌Re
MySQL高可用架構之MHA搭建以及測試(二)
一、MHA特點 MHA監控複製架構的主伺服器,一旦檢測到主伺服器故障,就會自動進行故障轉移。 即使有些從伺服器沒有收到最新的relay log,MHA自動從最新的從伺服器上識別差異的relay log並把這些日誌應用到其他從伺服器上,因此所有的從伺服器保持一致性了。MHA通
伺服器配置 之 centos 搭建伺服器-----mysql配置
mysql 分享給大家:https://pan.baidu.com/s/1fYeFDJ3OOlW4Nd6siyrjbw 密碼:9of6 Mysql安裝 步驟: 檢視CentOS自帶的mysql 輸入 rpm -qa | grep mys
ReactNative開發實戰一之環境搭建(Windows下)
作為微信公眾號(Zjiaxin)的開山篇文章------我們將從環境搭建開始:(Windows環境下)1首先準備必要的軟體和工具:Python 2、Node、ReactNative、AndroidStudio、WebStorm、Git、Genymotion。Python2:h
Windows server 2012下搭建MySQL資料庫並建立遠端連線
開發的首要任務就是要搭建起自己的伺服器,下面主要是我這搭建記錄下 我的各種環境 伺服器為Windows server2012 安裝的MySQL資料的版本是5.6.10 ,64位。當然了版本對於安裝沒有太大的阻撓。安裝資料庫呢一般是由兩種:一種是下載安裝包自己安裝,而另外一
Windows開發之——IIS的搭建
前言 Internet Information Server(簡稱IIS)是Windows系統提供的一種服務,它包括WWW伺服器、FTP伺服器和SMTP伺服器,是架設個人網站的首選。 Microsoft IIS 是允許在公共Intranet或Internet上釋出資訊的W
mysql之PXC5.7.18集群系列——1.Percona XtraDB Cluster搭建
1. 相關準備 備註:rhel不安裝epel,很多叢集搭建依賴的包無法通過yum安裝,很是不便 2. 叢集節點 Nodes Hostname IP HAProxy haproxy 172.16.3.30
php自學筆記之windows開發環境的搭建
眾所周知PHP整合開發環境有很多,如XAMPP、AppServ......只要一鍵安裝就把PHP環境給搭建好了。 但這種安裝方式不夠靈活,軟體的自由組合不方便
mysql之 mysql 5.6不停機主從搭建(一主一從基於日誌點複製)
環境說明: 版本 version 5.6.25-log 主庫ip: 10.219.24.25 從庫ip:10.219.24.22 os 版本: centos 6.7 已安裝熱備軟體:xtrabackup 防火牆已關 補充: 主從複製原理: http://blog.
C#+OpenGL程式設計之環境搭建(windows)
現在各種引擎紅紅火火,為什麼還要開影象基礎呢?現在的遊戲開發中遊戲引擎有什麼樣的地位,是不是不可缺少的。我覺得遊戲引擎或多或少的會對遊戲開發的靈活性有一些限制。不同公司使用的引擎應該是不一樣的,有沒有必要現在就確定去學習某一種遊戲引擎? 一般來說必須用的,涉及到遊戲製
Windows平臺安裝flutter之初體驗(安裝教程)
之前沒接觸過,挺說挺好用的,安裝來試試,but 每次都記不住步驟,索性記錄下來吧,安裝的過程真是不明覺厲 flutter:一款建立應用的開源庫、 1.安裝git 首先電腦上可以安裝git,可以方便從github網站下載安裝包,當然也可以從官網下載,但是國