Ruby/LDAP is an extension library for Ruby. It provides the interface to some LDAP libraries like OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.
The common API for application development is described in RFC1823 and is supported by Ruby/LDAP.
You can download and install a complete Ruby/LDAP package from SOURCEFORGE.NET.
Before installing Ruby/LDAP, make sure you have the following components -
现在,您可以使用标准的Ruby安装方法。在开始之前,如果您想查看extconf.rb的可用选项,请使用“--help”选项运行它。
$ ruby extconf.rb [--with-openldap1|--with-openldap2| --with-netscape|--with-wldap32] $ make $ make install
注 - 如果您在Windows上创建软件,则可能需要使用nmake而不是make。
这是一个两步的过程 -
以下是创建到LDAP目录的连接的语法。
LDAP::Conn.new(host = "localhost", port = LDAP_PORT)
主机 - 这是运行LDAP目录的主机ID。我们会把它当作localhost。
端口 - 这是用于LDAP服务的端口。标准的LDAP端口是636和389.确保服务器上正在使用哪个端口,否则可以使用LDAP :: LDAP_PORT。
该调用返回一个新的LDAP ::康恩连接到服务器,主机,端口的端口。
这是我们通常指定用于会话剩余部分的用户名和密码的地方。
以下是绑定LDAP连接的语法,使用DN,dn,凭据,pwd和bind方法,方法 -
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
如果给出了一个代码块,则自动被赋予块。
我们现在可以执行搜索,添加,修改或删除绑定方法(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
添加LDPA条目是一个两步过程 -
我们需要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在逻辑上是OR(“)。
此调用返回LDAP :: Mod对象,可以传递给LDAP :: Conn类中的方法,如Conn#add,Conn#add_ext,Conn#modify和Conn#modify_ext。
一旦我们准备好使用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 00zero"]), ] 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
修改条目与添加条目类似。只需调用modify方法,而不是添加要修改的属性。这是一个简单的修改方法语法。
conn.modify(dn, mods)
此方法修改具有DN,dn和属性mod的条目。这里,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
要删除一个条目,请调用具有可分辨名称的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目录上执行搜索,请使用搜索方法与三种不同的搜索模式之一 -
LDAP_SCOPE_BASEM - 仅搜索基本节点。
LDAP_SCOPE_ONELEVEL - 搜索基本节点的所有childNode。
LDAP_SCOPE_SUBTREE - 搜索包含基本节点的整个子树。
在这里,我们将搜索整个子树的入口dc = localhost,dc = localdomain为个人对象 -
#/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类的实例表示。使用搜索的最后一个参数,您可以指定感兴趣的属性,省略所有其他属性。如果您在此处传递零,则所有属性将返回与关系数据库中的“SELECT *”相同。
LDAP :: Entry类的dn方法(get_dn的别名)返回条目的可分辨名称,使用to_hash方法可以获取其属性(包括可分辨名称)的哈希表示。要获取条目属性的列表,请使用attrs方法(get_attributes的别名)。另外,要获取一个特定属性值的列表,请使用vals方法(get_values的别名)。
Ruby / LDAP定义了两个不同的异常类 -
如果发生错误,新的绑定或解除绑定方法会引发LDAP :: Error异常。
在添加,修改,删除或搜索LDAP目录时,会引发LDAP :: ResultError。