📅  最后修改于: 2020-10-16 06:06:12             🧑  作者: Mango
Ruby / LDAP是Ruby的扩展库。它提供了一些LDAP库的接口,例如OpenLDAP,UMich LDAP,Netscape SDK,ActiveDirectory。
RFC1823中描述了用于应用程序开发的通用API,并且Ruby / LDAP支持该API。
您可以从SOURCEFORGE.NET下载并安装完整的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 。
端口-这是用于LDAP服务的端口。标准LDAP端口是636和389。请确保服务器上正在使用哪个端口,否则可以使用LDAP :: LDAP_PORT。
此调用在端口port上返回到服务器host的新LDAP :: Conn连接。
我们通常在此处指定将在其余会话中使用的用户名和密码。
以下是使用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
添加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方法,而不是添加要修改的属性即可。这是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
要删除条目,请使用可分辨名称作为参数调用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_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
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文档的标准文档。