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'
ldap = Net::LDAP.new { 
  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 = {}
ldap.open { |conn|
  filter1 = Net::LDAP::Filter.eq('sAMAccountName', 'foo')
  conn.search(filter: filter1) do |entry|
    entry.each do |field, value|
      entries[field] = value
    end
  end
}
p entries お手軽。
