ActiveDirectoryサーバーを使ったLDAP認証(Rubyから)

via. http://metautonomo.us/2008/04/04/simplified-active-directory-authentication/

  1. rubygemsruby-net-ldap をインストール。
  2. 認証コードを書いてテストする。

2010/02/02:BASE指定が間違っていたので修正。ついでに戻り値をユーザー情報化。

require 'rubygems'
require 'net/ldap'

#AD認証モジュール
module ActiveDirectoryAuth

  # ADサーバー設定
  SERVER = 'ホスト名'    # ADサーバーのホスト名 or IPアドレス
  PORT = 389             # ADサーバーのポート番号 (default 389)
  BASE = 'ou=トップレベルOU, dc=hoge, dc=local'    # ou=トップレベルOU、dc=ADドメイン名1, dc=ADドメイン名2, ...
  DOMAIN = 'hoge.local'  # 「ADアカウント名@ADドメイン名」形式のドメイン名部分

  #ADユーザークラス
  class ActiveDirectoryUser
    attr_reader :account
    attr_reader :logged_in
    attr_reader :entries

    def initialize(account, logged_in, entries)
      @account = account
      @logged_in = logged_in
      @entries = entries
    end
  end

  # 認証処理メソッド(ユーザークラスを返す)
  def self.authenticate(account, pass)
    logged_in = false
    entries = nil

    #事前チェック
    raise "" if account.empty? or pass.empty?

    #LDAPサーバーに接続
    conn = Net::LDAP.new :host => SERVER, :port => PORT, :base => BASE,
                         :auth => { :username => "#{account}@#{DOMAIN}",
                                    :password => pass, :method => :simple }
    #認証処理
    if conn.bind
      logged_in = true
      #属性取得
      entries = Hash.new
      conn.open do |ldap|
        filter = Net::LDAP::Filter.eq("cn", account)
        ldap.search(:filter => filter, :return_result => false ) do |entry|
          entry.each do |attr_name, values|
            entries[attr_name] = values
          end
       end
      end
    end

    #ユーザークラスを生成して返す
    return ActiveDirectoryUser.new(account, logged_in, entries)

  #例外時はその時点での情報でユーザークラスを構築して返す
  rescue Net::LDAP::LdapError => e
    return ActiveDirectoryUser.new(account, logged_in, entries)
  end
end

user = ActiveDirectoryAuth::authenticate('アカウント名','パスワード')

puts "Account  : #{user.account}"
puts "Logged in: #{user.logged_in}"
if ( user.entries[:memberof] )
  puts "Groups =>"
  user.entries[:memberof].each do |group|
    puts "\t" + (group.split(","))[0].split("=")[1]
  end
end

成功すればユーザー情報が返ります。

Account  : アカウント名
Logged in: true
Groups =>
        GRP_HOGE
        Terminal Server License Servers
        Remote Desktop Users