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 -wrequire 'ldap'$HOST = 'localhost'$PORT = LDAP::LDAP_PORT$SSLPORT = LDAP::LDAPS_PORTconn = 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 -wrequire 'ldap'$HOST = 'localhost'$PORT = LDAP::LDAP_PORT$SSLPORT = LDAP::LDAPS_PORTconn = 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") exitendconn.perror("add")conn.unbind
修改LDAP条目
修改条目与添加条目类似.只需使用要修改的属性调用 modify 方法而不是 add .这是修改方法的简单语法.
conn.modify(dn,mods)
此方法使用DN, dn 和属性 mods 修改条目.这里, mods 应该是 LDAP :: Mod 对象的数组或属性/值数组对的散列.
示例
要修改我们在上一节中添加的条目的姓氏,我们将写入 :
#/usr/bin/ruby -wrequire 'ldap'$HOST = 'localhost'$PORT = LDAP::LDAP_PORT$SSLPORT = LDAP::LDAPS_PORTconn = 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") exitendconn.perror("modify")conn.unbind
删除LDAP条目
要删除条目,使用专有名称作为参数调用 delete 方法.这是 delete 方法的简单语法.
conn.delete(dn)
此方法删除DN为 dn 的条目.
示例
要删除我们在上一节中添加的 Zara Mohtashim 条目,我们会写 :
#/usr/bin/ruby -wrequire 'ldap'$HOST = 'localhost'$PORT = LDAP::LDAP_PORT$SSLPORT = LDAP::LDAPS_PORTconn = 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") exitendconn.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 = localdomaincn: Zara Alisn: Aliobjectclass: person
然后,我们可以使用以下代码修改其专有名称 :
#/usr/bin/ruby -wrequire 'ldap'$HOST = 'localhost'$PORT = LDAP::LDAP_PORT$SSLPORT = LDAP::LDAPS_PORTconn = 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") exitend方法使用三种不同的搜索模式之一 :