Ruby - LDAP教程

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

应用程序开发的通用API在RFC1823中描述,并由Ruby/LDAP支持.

Ruby/LDAP安装

下载并安装完整的Ruby/LDAP软件包SOURCEFORGE.NET .

在安装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连接

这是一个两步的过程 :

Step 1 : 创建连接对象

以下是创建与LDAP目录的连接的语法.

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

  • 主持人 : 这是运行LDAP目录的主机ID.我们将把它作为 localhost .

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

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

第2步和第2步;绑定

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

以下是绑定的语法LDAP连接,使用DN, dn ,凭据, pwd 和绑定方法,方法 :

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步和第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 #modvert和Conn #modate_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 .这是修改方法的简单语法.

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

修改专有名称

无法修改di带有修改方法的条目的标题名称.而是使用 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
方法使用三种不同的搜索模式之一 :