-

Ruby - LDAP Tutorial

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.

Ruby/LDAP Installation

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连接

这是一个两步的过程 -

步骤1 - 创建连接对象

以下是创建到LDAP目录的连接的语法。

LDAP::Conn.new(host = "localhost", port = LDAP_PORT)

该调用返回一个新的LDAP ::康恩连接到服务器,主机,端口的端口

步骤2 - 绑定

这是我们通常指定用于会话剩余部分的用户名和密码的地方。

以下是绑定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

添加LDAP条目

添加LDPA条目是一个两步过程 -

步骤1 - 创建LDAP :: Mod对象

我们需要LDAP :: Mod对象传递给conn.add方法来创建一个条目。以下是创建LDAP :: Mod对象的简单语法-

Mod.new(mod_type, attr, vals)

此调用返回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", "zero00zero"]),
]

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方法,而不是添加要修改的属性。这是一个简单的修改方法语法

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

删除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_rdntrue,则旧的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目录上执行搜索,请使用搜索方法与三种不同的搜索模式之一 -

在这里,我们将搜索整个子树的入口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方法的完整详细信息,请参阅LDAP文档的标准文档