Ruby-LDAPチュートリアル

Ruby / LDAPはRubyの拡張ライブラリです。OpenLDAP、UMich LDAP、Netscape SDK、ActiveDirectoryなどの一部のLDAPライブラリへのインターフェイスを提供します。

アプリケーション開発用の一般的なAPIはRFC1823で説明されており、Ruby / LDAPでサポートされています。

Ruby / LDAPのインストール

完全なRuby / LDAPパッケージをSOURCEFORGE.NETからダウンロードしてインストールできます。

Ruby / LDAPをインストールする前に、次のコンポーネントがあることを確認してください-

  • Ruby 1.8.x(ldap / controlを使用する場合は少なくとも1.8.2)。
  • OpenLDAP、Netscape SDK、Windows2003またはWindowsXP。

これで、標準のRubyインストール方法を使用できます。開始する前に、extconf.rbで使用可能なオプションを確認したい場合は、「-help」オプションを指定して実行してください。

$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
                   --with-netscape|--with-wldap32]
$ make
$ make install

NOTE− Windowsでソフトウェアをビルドしている場合は、makeの代わりにnmakeを使用する必要がある場合があります。

LDAP接続を確立する

これは2段階のプロセスです-

ステップ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-バインディング

これは通常、セッションの残りの部分で使用するユーザー名とパスワードを指定する場所です。

以下は、DNを使用してLDAP接続をバインドするための構文です。 dn、資格情報、 pwd、およびバインドメソッド、 method

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

コードブロックが与えられた場合、自己はブロックに譲られます。

適切な権限があれば、bindメソッドのブロック内(bindとunbindの間)で検索、追加、変更、または削除操作を実行できるようになりました。

Example

ローカルサーバーで作業していると仮定して、適切なホスト、ドメイン、ユーザー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エントリの追加は2段階のプロセスです-

ステップ1- LDAP :: Modオブジェクトを作成する

エントリを作成するには、conn.addメソッドにLDAP :: Modオブジェクトを渡す必要がありますLDAP :: Modオブジェクトを作成するための簡単な構文を次に示します-

Mod.new(mod_type, attr, vals)
  • mod_type − 1つ以上のオプションLDAP_MOD_ADD、LDAP_MOD_REPLACE、またはLDAP_MOD_DELETE。

  • attr −操作する属性の名前である必要があります。

  • vals−はattrに関連する値の配列です。valsにバイナリデータが含まれている場合、mod_typeLDAP_MOD_BVALUESと論理的にOR(|)する必要があります。

この呼び出しは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オブジェクトの配列、または属性と値の配列ペアのハッシュのいずれかである必要があります

Example

これは完全な例で、2つのディレクトリエントリを作成します-

#/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メソッドを呼び出すだけです。これはmodifyメソッドの簡単な構文です。

conn.modify(dn, mods)

このメソッドは、DN、dn、および属性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', ['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

LDAPエントリの削除

エントリを削除するには、識別名をパラメータとしてdeleteメソッドを呼び出します。これがdeleteメソッドの簡単な構文です。

conn.delete(dn)

このメソッドは、DN、dnを持つエントリを削除します

前のセクションで追加したZaraMohtashimエントリを削除するには、次のように記述します。

#/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)

このメソッドは、エントリのRDNをDN、dnで変更し、新しいRDN、new_rdnを与えます。場合delete_old_rdnがある、古い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ディレクトリで検索を実行するには、3つの異なる検索モードのいずれかで検索方法を使用します-

  • 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のエイリアス)を使用します。また、1つの特定の属性の値のリストを取得するには、valsメソッド(get_valuesのエイリアス)を使用します。

エラーの処理

Ruby / LDAPは2つの異なる例外クラスを定義します-

  • エラーが発生した場合、new、bind、またはunbindメソッドはLDAP :: Error例外を発生させます。

  • LDAPディレクトリを追加、変更、削除、または検索すると、LDAP :: ResultErrorが発生します。

参考文献

LDAP方法の詳細については、のための標準的なドキュメントを参照してくださいLDAPのドキュメント。