須藤です。
先日、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を触る機会があったらどうぞ。