須藤です。

先日、ActiveLdap 1.0.1がリリースされました。
  http://rubyforge.org/projects/ruby-activeldap/

ActiveLdapとはLDAPのエントリをActiveRecordと同じようなAPIで
操作するためのライブラリで、こんな風に書けます。

  matz = User.find("Matz")
  matz.description = "The father of Ruby"
  matz.save!


また、ActiveRecordと同じようにエントリ間の関係を定義して、簡
単にアクセスすることもできます。

  class Member < ActiveLdap::Base
    belongs_to :groups, :many => "memberUid"
  end

  class Group < ActiveLdap::Base
    has_many :members, :wrap => "memberUid"
  end

  developers = Group.find("developers")
  developers.members # => [Member("Matz"), Member("ko1"), ...]

  ko1 = Member.find("ko1")
  ko1.groups # => [Group("developers"), Group("Rubyist"), ...]

  staffs = Group.find("RubyKaigi2009 Staffs")
  ko1.groups << staffs
  staffs.reload
  staffs.members # => [Member("ko1"), ...]


他の特徴は以下のとおりです。

  * わりと真面目なLDIFパーサを持つ
  * わりと真面目なLDAPスキーマパーサを持つ
  * わりと真面目なDNパーサを持つ
  * ひととおりのuserPasswordハッシュ化サポート
    (CRYPT/MD5/SMD5/SHA/SSHA)
  * OpenLDAPだけではなく、Active DirectoryやeDirectoryとも
    うまく動くっぽい(報告例あり)
  * LDAPスキーマに則ったバリデーション機能
  * ActiveRecordと同じバリデーション機能
  * Ruby-GetText-Packageサポート
  * ActiveSupport/ActiveRecord 2.1.0サポート(←に依存している)
  * 複数のLDAPバックエンドをサポート

ActiveLdapはLDAP接続のための機能をもっておらず、以下のライブ
ラリをバックエンドとして利用してLDAPと接続します。

  * Ruby/LDAP: http://raa.ruby-lang.org/project/ruby-ldap/
    * 拡張ライブラリ
  * Net::LDAP: http://rubyforge.org/projects/net-ldap/
    * Pure Ruby。リリースされているものだと動かない。
      Subversionにあるやつを使わないといけない。
      http://net-ldap.rubyforge.org/svn/branches/experimental_netldap/
  * javax.naming.directory.ldap
    * JRubyのみで利用可能。大体動く。


javax.naming.directory.ldapは
  ruby 1.8.6 (2008-06-12 rev 6586) [i386-jruby1.1.2]
というJRubyで単体テストを走らせて確認したくらいです。
(ほとんどのテストがパスする状態)
実際に使ってみて問題があるかどうかはわかりません。



検索する時の速度は以下のような感じになります。

  (1) Ruby/LDAPを直接使う
  (2) Net::LDAPを直接使う          # (1)より10倍くらい遅い
  (3) ActiveLdap + Ruby/LDAPを使う # (2)より3倍くらい遅い
  (4) ActiveLdap + Net::LDAPを使う # (3)より少し遅い

Ruby/LDAPの方がNet::LDAPよりも圧倒的に速いのですが、
ActiveLdapが検索結果をオブジェクト化する部分がボトルネックに
なるので、ActiveLdapレベルではバックエンドでの速度差はそんな
にでないです。

ベンチマークの実行例:
  % ruby benchmark/bench-al.rb --config benchmark/config.yaml
  Populating...

  Rehearsal ---------------------------------------------------------------
    1x: AL(LDAP)                0.240000   0.010000   0.250000 (  0.278655)
    1x: AL(Net::LDAP)           0.370000   0.020000   0.390000 (  0.414705)
    1x: AL(LDAP: No Obj)        0.010000   0.000000   0.010000 (  0.015984)
    1x: AL(Net::LDAP: No Obj)   0.050000   0.000000   0.050000 (  0.073965)
    1x: LDAP                    0.000000   0.000000   0.000000 (  0.002850)
    1x: Net::LDAP               0.050000   0.000000   0.050000 (  0.065836)
  ------------------------------------------------------ total: 0.750000sec

                                    user     system      total        real
    1x: AL(LDAP)                0.140000   0.010000   0.150000 (  0.149693)
    1x: AL(Net::LDAP)           0.170000   0.010000   0.180000 (  0.188454)
    1x: AL(LDAP: No Obj)        0.020000   0.000000   0.020000 (  0.025716)
    1x: AL(Net::LDAP: No Obj)   0.040000   0.010000   0.050000 (  0.060187)
    1x: LDAP                    0.010000   0.000000   0.010000 (  0.008380)
    1x: Net::LDAP               0.040000   0.000000   0.040000 (  0.048604)

  Entries processed by Ruby/ActiveLdap + LDAP: 100
  Entries processed by Ruby/ActiveLdap + Net::LDAP: 100
  Entries processed by Ruby/ActiveLdap + LDAP: (without object creation): 100
  Entries processed by Ruby/ActiveLdap + Net::LDAP: (without object creation): 100
  Entries processed by Ruby/LDAP: 100
  Entries processed by Net::LDAP: 100

  Cleaning...


もし、LDAPを触る機会があったらどうぞ。