📜  Ruby-LDAP教程

📅  最后修改于: 2020-10-16 06:06:12             🧑  作者: Mango


Ruby / LDAP是Ruby的扩展库。它提供了一些LDAP库的接口,例如OpenLDAP,UMich LDAP,Netscape SDK,ActiveDirectory。

RFC1823中描述了用于应用程序开发的通用API,并且Ruby / LDAP支持该API。

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

  • 端口-这是用于LDAP服务的端口。标准LDAP端口是636和389。请确保服务器上正在使用哪个端口,否则可以使用LDAP :: LDAP_PORT。

此调用在端口port上返回到服务器host的新LDAP :: Conn连接。

第2步-绑定

我们通常在此处指定将在其余会话中使用的用户名和密码。

以下是使用DN, dn ,凭据pwd和bind方法来绑定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方法,而不是添加要修改的属性即可。这是Modify方法的简单语法。

conn.modify(dn, mods)

此方法使用DN dn和属性mods修改条目。在这里, mod应该是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目录上执行搜索,请在三种不同的搜索模式之一中使用搜索方法-

  • LDAP_SCOPE_BASEM-仅搜索基本节点。

  • LDAP_SCOPE_ONELEVEL-搜索基本节点的所有子节点。

  • 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类的实例表示。使用搜索的最后一个参数,您可以指定感兴趣的属性,而忽略所有其他属性。如果在此处传递nil,则在关系数据库中,所有属性都将与“ SELECT *”相同地返回。

LDAP :: Entry类的dn方法(别名为get_dn)返回条目的可分辨名称,使用to_hash方法,您可以获取其属性的哈希表示(包括可分辨名称)。要获取条目属性的列表,请使用attrs方法(get_attributes的别名)。另外,要获取一个特定属性值的列表,请使用vals方法(get_values的别名)。

处理错误

Ruby / LDAP定义了两个不同的异常类-

  • 如果发生错误,新的,绑定或解除绑定的方法将引发LDAP :: Error异常。

  • 如果添加,修改,删除或搜索LDAP目录,则会引发LDAP :: ResultError。

进一步阅读

有关LDAP方法的完整详细信息,请参阅LDAP文档的标准文档。