Ruby/LDAP是Ruby的扩展库。它提供了一些LDAP库的接口,如OpenLDAP,UMich LDAP,Netscape SDK,ActiveDirectory。
RFC1823中描述了用于应用程序开发的通用API,并且Ruby/LDAP支持该API。
您可以从下载并安装完整的Ruby/LDAP程序包 : https://sourceforge.net/projects/ruby-ldap/
在安装Ruby/LDAP之前,请确保您具有以下组件-
现在,您可以使用标准的Ruby安装方法。开始之前,如果您想查看extconf.rb的可用选项,请使用'--help'选项运行它。
$ruby extconf.rb [--with-openldap1|--with-openldap2|\ --with-netscape|--with-wldap32] $make $make install
注意-如果要在Windows上构建软件,则可能需要使用 nmake 而不是 make 。
这是一个两步过程-
以下是创建与LDAP目录的连接的语法。
LDAP::Conn.new(host='localhost', port=LDAP_PORT)
host - 这是运行LDAP目录的主机ID。无涯教程将其作为 localhost 。
port - 这是用于LDAP服务的端口。标准LDAP端口是636和389。请确保服务器上正在使用哪个端口,否则可以使用LDAP::LDAP_PORT。
此调用在端口端口上返回到服务器主机的新 LDAP::Conn 连接。
通常在此处指定将在其余会话中使用的用户名和密码。
以下是使用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
添加LDPA条目是一个两步过程-
无涯教程需要将 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。
一旦准备好 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
修改一项类似于添加一项。只需使用要修改的属性调用 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', ['Learnfk']), ] begin conn.modify("cn=Zara Ali, dc=localhost, dc=localdomain", entry1) rescue LDAP::ResultError conn.perror("modify") exit end conn.perror("modify") conn.unbind
要删除条目,请以专有名称作为参数调用 delete 方法。这是 delete 方法的简单语法。
conn.delete(dn)
此方法删除带有DN dn 的条目。
要删除在上一节中添加的 Zara Learnfk 条目,将这样写:
#/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-Learnfk, 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
然后,可以使用以下代码修改其专有名称(name)-
链接:https://www.learnfk.comhttps://www.learnfk.com/ruby/ruby-ldap.html
来源:LearnFk无涯教程网
#/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 Learnfk", 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定义了两个不同的异常类-
如果发生错误,新的,绑定或取消绑定的方法将引发LDAP::Error异常。
如果添加,修改,删除或搜索LDAP目录,则会引发LDAP::ResultError。
有关LDAP方法的完整详细信息,请参阅 LDAP文档。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
HarmonyOS快速入门与实战 -〔QCon+案例研习社〕