- 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 文档 的标准文档。