ActiveDirectoryサーバーを使ったLDAP認証(Rubyから)
via. http://metautonomo.us/2008/04/04/simplified-active-directory-authentication/
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