个性化阅读
专注于IT技术分析

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 *”相同。


赞(0) 打赏
未经允许不得转载:srcmini » Ruby LDAP开发实战和原理全解
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏