- Ruby 基礎
- Ruby - 首頁
- Ruby - 概述
- Ruby - 環境設定
- Ruby - 語法
- Ruby - 類和物件
- Ruby - 變數
- Ruby - 運算子
- Ruby - 註釋
- Ruby - IF...ELSE
- Ruby - 迴圈
- Ruby - 方法
- Ruby - 程式碼塊
- Ruby - 模組
- Ruby - 字串
- Ruby - 陣列
- Ruby - 雜湊表
- Ruby - 日期和時間
- Ruby - 範圍
- Ruby - 迭代器
- Ruby - 檔案 I/O
- Ruby - 異常
Ruby - LDAP 教程
Ruby/LDAP 是 Ruby 的一個擴充套件庫。它提供了一些 LDAP 庫(如 OpenLDAP、UMich LDAP、Netscape SDK、ActiveDirectory)的介面。
應用程式開發的通用 API 在 RFC1823 中進行了描述,並且 Ruby/LDAP 支援它。
Ruby/LDAP 安裝
您可以從 SOURCEFORGE.NET 下載並安裝完整的 Ruby/LDAP 包。
在安裝 Ruby/LDAP 之前,請確保您擁有以下元件:
- Ruby 1.8.x(如果您想使用 ldap/control,則至少為 1.8.2)。
- OpenLDAP、Netscape SDK、Windows 2003 或 Windows XP。
現在,您可以使用標準的 Ruby 安裝方法。在開始之前,如果您想檢視 extconf.rb 的可用選項,請使用 '--help' 選項執行它。
$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
--with-netscape|--with-wldap32]
$ make
$ make install
注意 - 如果您在 Windows 上構建軟體,則可能需要使用 nmake 而不是 make。
建立 LDAP 連線
這是一個兩步過程:
步驟 1 - 建立連線物件
以下是建立與 LDAP 目錄連線的語法。
LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
host - 這是執行 LDAP 目錄的主機 ID。我們將將其作為 localhost。
port - 這是用於 LDAP 服務的埠。標準 LDAP 埠為 636 和 389。確保您的伺服器上使用了哪個埠,否則您可以使用 LDAP::LDAP_PORT。
此呼叫返回一個新的 LDAP::Conn 連線到伺服器 host,埠為 port。
步驟 2 - 繫結
在這裡,我們通常指定將在本會話的其餘部分使用的使用者名稱和密碼。
以下是使用 DN、dn、憑據、pwd 和繫結方法、method 繫結 LDAP 連線的語法:
conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do .... end
您可以使用相同的方法,無需程式碼塊。在這種情況下,您需要顯式地取消繫結連線,如下所示:
conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE) .... conn.unbind
如果給定程式碼塊,則將 self 傳遞給程式碼塊。
現在,我們可以在 bind 方法的程式碼塊內(bind 和 unbind 之間)執行搜尋、新增、修改或刪除操作,前提是我們具有適當的許可權。
示例
假設我們在本地伺服器上工作,讓我們將所有內容與適當的主機、域、使用者 ID 和密碼等結合起來。
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
....
conn.unbind
新增 LDAP 條目
新增 LDPA 條目是一個兩步過程:
步驟 1 - 建立 LDAP::Mod 物件
我們需要將 LDAP::Mod 物件傳遞給 conn.add 方法以建立條目。以下是如何建立 LDAP::Mod 物件的簡單語法:
Mod.new(mod_type, attr, vals)
mod_type - 一個或多個選項 LDAP_MOD_ADD、LDAP_MOD_REPLACE 或 LDAP_MOD_DELETE。
attr - 應該是要操作的屬性的名稱。
vals - 是與 attr 相關的值的陣列。如果 vals 包含二進位制資料,則 mod_type 應與 LDAP_MOD_BVALUES 進行邏輯或運算 (|)。
此呼叫返回 LDAP::Mod 物件,該物件可以傳遞給 LDAP::Conn 類中的方法,例如 Conn#add、Conn#add_ext、Conn#modify 和 Conn#modify_ext。
步驟 2 - 呼叫 conn.add 方法
一旦我們準備好 LDAP::Mod 物件,我們就可以呼叫 conn.add 方法來建立條目。以下是呼叫此方法的語法:
conn.add(dn, attrs)
此方法使用 DN、dn 和屬性、attrs 新增一個條目。這裡,attrs 應該是一個 LDAP::Mod 物件的陣列或一個屬性/值陣列對的雜湊表。
示例
以下是一個完整的示例,它將建立兩個目錄條目:
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
conn.perror("bind")
entry1 = [
LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']),
]
entry2 = [
LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']),
LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']),
LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn',
['ttate','ALI', "zero\000zero"]),
]
begin
conn.add("dc = localhost, dc = localdomain", entry1)
conn.add("cn = Zara Ali, dc = localhost, dc = localdomain", entry2)
rescue LDAP::ResultError
conn.perror("add")
exit
end
conn.perror("add")
conn.unbind
修改 LDAP 條目
修改條目類似於新增條目。只需使用要修改的屬性呼叫 modify 方法而不是 add 方法即可。以下是 modify 方法的簡單語法。
conn.modify(dn, mods)
此方法使用 DN、dn 和屬性、mods 修改一個條目。這裡,mods 應該是一個 LDAP::Mod 物件的陣列或一個屬性/值陣列對的雜湊表。
示例
要修改我們在上一節中新增的條目的姓氏,我們將編寫:
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
conn.perror("bind")
entry1 = [
LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']),
]
begin
conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1)
rescue LDAP::ResultError
conn.perror("modify")
exit
end
conn.perror("modify")
conn.unbind
刪除 LDAP 條目
要刪除條目,請使用區分名稱作為引數呼叫 delete 方法。以下是 delete 方法的簡單語法。
conn.delete(dn)
此方法使用 DN、dn 刪除一個條目。
示例
要刪除我們在上一節中新增的 Zara Mohtashim 條目,我們將編寫:
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
conn.perror("bind")
begin
conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain")
rescue LDAP::ResultError
conn.perror("delete")
exit
end
conn.perror("delete")
conn.unbind
修改區分名稱
無法使用 modify 方法修改條目的區分名稱。相反,請使用 modrdn 方法。以下是 modrdn 方法的簡單語法:
conn.modrdn(dn, new_rdn, delete_old_rdn)
此方法使用 DN、dn 修改條目的 RDN,賦予它新的 RDN、new_rdn。如果 delete_old_rdn 為 true,則將從條目中刪除舊的 RDN 值。
示例
假設我們有以下條目:
dn: cn = Zara Ali,dc = localhost,dc = localdomain cn: Zara Ali sn: Ali objectclass: person
然後,我們可以使用以下程式碼修改其區分名稱:
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
conn.perror("bind")
begin
conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true)
rescue LDAP::ResultError
conn.perror("modrdn")
exit
end
conn.perror("modrdn")
conn.unbind
執行搜尋
要對 LDAP 目錄執行搜尋,請使用 search 方法和三種不同的搜尋模式之一:
LDAP_SCOPE_BASEM - 只搜尋基本節點。
LDAP_SCOPE_ONELEVEL - 搜尋基本節點的所有子節點。
LDAP_SCOPE_SUBTREE - 搜尋整個子樹,包括基本節點。
示例
在這裡,我們將搜尋 dc = localhost, dc = localdomain 條目的整個子樹以查詢 person 物件:
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
base = 'dc = localhost,dc = localdomain'
scope = LDAP::LDAP_SCOPE_SUBTREE
filter = '(objectclass = person)'
attrs = ['sn', 'cn']
conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
conn.perror("bind")
begin
conn.search(base, scope, filter, attrs) { |entry|
# print distinguished name
p entry.dn
# print all attribute names
p entry.attrs
# print values of attribute 'sn'
p entry.vals('sn')
# print entry as Hash
p entry.to_hash
}
rescue LDAP::ResultError
conn.perror("search")
exit
end
conn.perror("search")
conn.unbind
這將為每個匹配的條目呼叫給定的程式碼塊,其中 LDAP 條目由 LDAP::Entry 類的例項表示。使用搜索的最後一個引數,您可以指定您感興趣的屬性,省略所有其他屬性。如果您在此處傳遞 nil,則所有屬性都將返回,與關係資料庫中的“SELECT *”相同。
LDAP::Entry 類的 dn 方法(get_dn 的別名)返回條目的區分名稱,並且使用 to_hash 方法,您可以獲取其屬性的雜湊表示形式(包括區分名稱)。要獲取條目屬性列表,請使用 attrs 方法(get_attributes 的別名)。此外,要獲取一個特定屬性的值列表,請使用 vals 方法(get_values 的別名)。
處理錯誤
Ruby/LDAP 定義了兩個不同的異常類:
如果發生錯誤,則 new、bind 或 unbind 方法將引發 LDAP::Error 異常。
如果新增、修改、刪除或搜尋 LDAP 目錄,則會引發 LDAP::ResultError 異常。
進一步閱讀
有關 LDAP 方法的完整詳細資訊,請參閱 LDAP 文件 的標準文件。