📜  Ruby LDAP

📅  最后修改于: 2021-01-08 13:23:12             🧑  作者: Mango

Ruby LDAP

Net :: LDAP for Ruby也写为net :: ldap。它代表轻型目录访问协议。它是用于访问目录服务器的Internet标准协议。它的基本搜索单位是实体,它对应于人或其他特定领域的对象。支持LDAP协议的目录通常存储有关许多实体的信息。

Ruby LDAP主体

LDAP服务器通常用于访问有关人员的信息,但有时也用于诸如计算机,打印机和其他资源之类的项目。

Ruby LDAP专有名称

在LDAP服务器中,实体由称为专有名称的全局唯一文本字符串唯一标识。就像DNS主机名一样,DN是字符串树节点的“扁平化”文本表示形式。

如果您知道某个人或其他实体的DN,则可以查询启用LDAP的目录以获取有关该实体的信息。否则,您还可以看到与您提供的一组条件匹配的DN列表。

Ruby LDAP属性

在LDAP中,有关实体的信息存储为一组属性。属性是与零个或多个值关联的文本字符串。大多数启用LDAP的目录都包含标准化的属性范围,并根据标准值限制其值。

属性的示例是sn 。它代表“姓”。此属性通常用于存储人的姓氏。大多数目录遵循标准约定,即实体sn属性将仅具有一个值。

Ruby LDAP树基

就像DNS一样,LDAP假定每个目录服务器都包含一组DN的权威属性数据,这些DN对应于全局目录树的特定子树。创建该子树后,会将其配置到目录服务器中。您无法查询大多数服务器,因为它们不允许这样做,除非您指定正确的树基。

Ruby LDAP版本

Ruby LDAP版本存根,讨论v2和v3。

Ruby LDAP操作

Ruby LDAP操作是:

  • #bind: #bind操作向服务器提供用户的身份验证凭据。它们可以提供不同的身份验证凭据,但是大多数目录仅要求提供用户名和密码。
  • #add: #add操作指定一个新的DN和一组初始的属性值。操作成功后,具有相应DN和属性的新实体将添加到目录中。
  • #delete: #delete操作指定实体DN。操作成功后,实体及其所有属性将从目录中删除。
  • #rename: #rename操作也称为#modify_rdn。在早期的LDAP版本中,更改实体DN的唯一方法是删除整个实体,然后使用其他DN重新添加它。但是,随着版本3中引入的#rename操作,您可以更改DN而不丢弃其属性值。
  • #search:通过指定树基,搜索过滤器和属性值列表,调用#search操作以标识目录。可以使用NOT,AND和OR运算符将多个过滤器结合在一起。
  • #modify: #modify操作指定实体DN和属性操作列表。它用于更改存储在目录中的特定实体的属性值。它可以添加或删除属性,也可以通过添加或删除属性值来更改属性。可以使用三种方法来修改属性值:#add_attribute,#delete_attribute和#replace_attreibute。

安装Net :: LDAP

net :: LDAP是一个纯Ruby库。它不需要任何外部库。 Net :: LDAP的RubyGems版本可以从常规来源安装。

要求

Net :: LDAP需要Ruby 2.0.0解释器或更高版本。

要安装Net :: LDAP的RubyGems版本,请编写以下命令:

gem install net-ldap

使用Ruby net :: LDAP

Net :: LDAP功能首先需要该库。

require 'net/ldap'

如果您已安装Gem版本,则需要以下库。

require 'rubygems'
require 'net/ldap'

LDAP连接的凭证

Net :: LDAP连接是一个两步过程。

步骤1:实例化Net:LDAP对象

大多数Net:LDAP操作都是通过实例化Net:LDAP对象开始的。构造函数采用指定LDAP服务器的地址和端口的参数。

句法:

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

步骤1:身份验证(绑定)

在这里,我们需要指定用户名和密码,我们将在其余的会话中使用该用户名和密码。

句法:

conn.bind(dn=nil, password=nil, method=LDAP::LDAP_AUTH_SIMPLE)do
....
end

现在,我们可以在具有适当权限的情况下执行不同的操作,例如在bind方法的内部进行搜索,修改或删除。

添加一个新的LDAP条目

以下方法将新条目添加到远程LDAP服务器。

add(args) => object

步骤1:创建LDAP :: Mod对象

需要将LDAP :: Mod对象传递给conn.add方法以创建条目。

句法:

Mod.new(mod_type, attr, vals)

mod_type:您可以在此处添加一个或多个选项,例如LDAP_MOD_ADD,LDAP_MOD_DELETE,LDAP_MOD_REPLACE。

attr:这是属性的名称。

vals:这是一个值数组。

步骤2:调用conn.add方法

创建LDAP :: Mod对象后,我们需要调用conn.add方法。

句法:

conn.add(dn, attrs)

例:

#/usr/bin/ruby -w 

require 'rubygems' 
require 'net/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', ['Steele']), 
] 

begin 
  conn.modify("cn=Anna williams, dc=localhost, dc=localdomain", entry1) 
rescue LDAP::ResultError 
  conn.perror("modify") 
  exit 
end 
conn.perror("modify") 
conn.unbind

上面的示例将修改上一个示例中的姓。

删除LDAP条目

delete方法将删除一个条目。

句法:

conn.delete(dn)
#/usr/bin/ruby -w 

require 'rubygems' 
require 'net/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=Anna Steele, dc=localhost, dc=localdomain") 
rescue LDAP::ResultError 
  conn.perror("delete") 
  exit 
end 
conn.perror("delete") 
conn.unbind

在LDAP中搜索

使用搜索方法执行搜索的方式有3种。

  • LDAP_SCORE_BASEM:它将仅搜索基本模式。
  • LDAP_SCOPE_ONLEVEL:它将搜索基本模式的所有子级。
  • LDAP_SCOPE_SUBTREE:它将搜索整个子树,包括基本节点。

例:

#/usr/bin/ruby -w 

require 'rubygems' 
require 'net/ldap' 

$HOST =    'localhost' 
$PORT =    LDAP::LDAP_PORT 
$SSLPORT = LDAP::LDAPS_PORT 

base = 'dc=localhost,dc=localdomain' 
scope = LDAP::LDAP_SCOPE_SUBTREE 
filter = '(objectclass=java)' 
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 

在此示例中,我们将搜索条目的整个子树。

在搜索的最后一个参数中,您可以指定任何属性。如果传递nil,则在关系数据库中返回的所有属性均与“ SELECT *”相同。