RubyからLDAPをつかう
Posted on 2016-03-07
所用でRubyからLDAPを使う必要があったので調べた。
そもそもLDAPとは
RDBのテーブルのようなものを想定しておけばいいようだ。
ただし、各レコードが構造をもち、各レコードに階層構造のインデックスがついている。
yoshitsugu.hogehoge.ne.jp をひっぱってくれば jp -> ne -> hogehoge -> yoshitsugu とインデックスをたどっていき、たどった先にある電話番号とかメールアドレスとかがずるずるっとひけるイメージ。
詳しくはRFC4510などを参考にするとよいと思う。
LDAP用のgem
ruby-ldap
メンテされてないのか安定しているのかわからないが、2009/4/21からupdateされていない。
一部C実装なので下のnet-ldapよりはやいらしい。net-ldap
Pure Rubyのライブラリ。
Pure Rubyなので、ruby-ldapより遅いが、ポータビリティが高い。
Ruby ToolBox を見ると Devise LDAP Authenticalble など他にもいくつかあるようだ。
Net::LDAP
上記のうち、net-ldapを使った。理由は一番メンテされてそうなことと、ポータビリティが高いから。
使い方は簡単で例えば、以下のようにすればfilterした結果を取得できる。
require 'net/ldap'
PORT = 636 # ldapは389, ldapsは636
DOMAIN = 'hogehoge.ne.jp'
SERVER = "ldap.#{DOMAIN}"
BASE = 'DC=hogehoge,DC=ne,DC=jp'
= Net::LDAP.new {
ldap host: SERVER,
port: PORT,
base: BASE,
encryption: :simple_tls, # ldaps じゃなければいらない
auth: {
username: 'cn=ldapuser,dc=hogehoge,dc=ne,dc=jp',
password: 'PASSWORD',
method: :simple
}
}
raise 'bind failed' unless ldap.bind
= {}
entries
.open { |conn|
ldap= Net::LDAP::Filter.eq('sAMAccountName', 'foo')
filter1 .search(filter: filter1) do |entry|
conn.each do |field, value|
entry[field] = value
entriesend
end
}
p entries
お手軽。