RubyからLDAPをつかう

Posted on March 7, 2016 , Tags: Ruby, LDAP

所用で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 

お手軽。

参考