Ruby - LDAP教程

首页 / Ruby入门教程 / Ruby - LDAP教程

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

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

Ruby/LDAP安装

您可以从下载并安装完整的Ruby/LDAP程序包 : https://sourceforge.net/projects/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 。

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

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

无涯教程网

步骤2-bind

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

以下是使用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

添加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 方法而不是 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

删除LDAP条目

要删除条目,请以专有名称作为参数调用 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)-

#/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文档

这一章《Ruby - LDAP教程》你学到了什么?在下面做个笔记吧!做站不易,你的分享是对我们最大的支持,感谢!😊

好记忆不如烂笔头。留下你的足迹吧 :)

相关推荐

微服务架构实战160讲 -〔杨波 - 〕

趣谈网络协议 -〔刘超 - 〕

爆款文案修炼手册 -〔乐剑峰 - 〕

讲好故事 -〔涵柏 - 〕

Ruby 按变量条件划分数组数组

线程安全:Ruby 中的类变量

如何只获取没有命名空间的类名

如何通过匹配 Capybara 中元素的确切文本来查找元素

哈希或其他对象的内存大小?

将块传递给方法传递给Ruby中的另一个方法

视频推荐

Ruby - 模块的定义 更多视频教程 »