RailsアプリケーションをActiveDirectoryまでフックします。ADとデータベース(現在はMySQL)の間でユーザーに関するデータを同期します(ただし、SQL ServerまたはPostgreSQLに変わる可能性があります)。
私はactivedirectory-Rubyをチェックアウトしましたが、それは本当にバグが多いようです(1.0リリースの場合は!?)。これはNet :: LDAPをラップするので、代わりにそれを使用してみましたが、実際のLDAPの構文に非常に近く、ActiveRecordに似た構文のため、ActiveDirectory-Rubyの抽象化を楽しんでいました。
ディレクトリサーバー用のエレガントなORMタイプのツールはありますか?さらに良いのは、LDAP用のある種の足場ツール(ユーザー、グループ、組織単位などのCRUD)がある場合です。次に、Authlogicを介して既存の認証コードとすばやく統合し、すべてのデータの同期を保つことができます。
これが net-ldap gemで使用するサンプルコードです。私の仕事でActiveDirectoryサーバーからのユーザーログインを確認します。
require 'net/ldap' # gem install net-ldap
def name_for_login( email, password )
email = email[/\A\w+/].downcase # Throw out the domain, if it was there
email << "@mycompany.com" # I only check people in my company
ldap = Net::LDAP.new(
Host: 'ldap.mycompany.com', # Thankfully this is a standard name
auth: { method: :simple, email: email, password:password }
)
if ldap.bind
# Yay, the login credentials were valid!
# Get the user's full name and return it
ldap.search(
base: "OU=Users,OU=Accounts,DC=mycompany,DC=com",
filter: Net::LDAP::Filter.eq( "mail", email ),
attributes: %w[ displayName ],
return_result:true
).first.displayName.first
end
end
最後のfirst.displayName.first
コードは少し間抜けに見えるので、いくつかの説明から利益を得る可能性があります。
Net::LDAP#search
は、1つのエントリにのみ一致する場合でも、常に結果の配列を返します。 first
の最初の呼び出しは、電子メールアドレスに一致した最初の(そしておそらく唯一の)エントリを見つけます。
検索によって返される Net::LDAP::Entry
を使用すると、メソッド名を介して属性に簡単にアクセスできるため、some_entry.displayName
はsome_entry['displayName']
と同じです。
Net::LDAP::Entry
のすべての属性は、値が1つしか存在しない場合でも、常に値の配列です。複数の「displayName」値を持つユーザーがいるのはばかげているかもしれませんが、LDAPの一般的な性質は、それが可能であることを意味します。最後のfirst
呼び出しは、1つの文字列の配列をユーザーのフルネームの文字列に変換します。
これは実際の答えよりも逸話です...
SambaとOpenLDAPサーバーを使用して同様の経験をしました。自分のやりたいことを実際に行うためのライブラリーが見つからなかったので、自分のヘルパークラスを作成しました。
私は ldapbrowser を使用して、ユーザーを「公式」の方法で作成したときにSambaがどのフィールドに入力したかを確認し、基本的にそれを複製しました。
トリッキー/非標準のLDAPの唯一のことは、私たちが持っているクレイジーなパスワード暗号化でした:
userPass:
_"{MD5}" + Base64.encode64(Digest::MD5.digest(pass))
_
sambaNTPassword:
_OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase
_
def authenticate(user, pass)
関数の場合、資格情報を使用してLDAPをドメインにバインドしようとします。例外をキャッチした場合はログインに失敗し、それ以外の場合は許可します。
申し訳ありませんが、まだコメントできません...おそらく誰かがこれを適切に再配置できます。
@Phrogzのソリューションはうまく機能しますが、bind_simple(bind内)は、auth [:username]が次のように設定されていないため、Net :: LDAP :: LdapError例外を発生させます。
https://github.com/Ruby-ldap/Ruby-net-ldap/blob/master/lib/net/ldap.rb
修正された置換:
auth: { method: :simple, email: email, password:password }
と:
auth: { method: :simple, username: email, password:password }
Ruby-activedirectoryを使い始め、それを拡張/いくつかの修正を加えて、Githubでjudy-activedirectoryをホストしました。
次の繰り返しで、ActiveLdapのコードベースがはるかに優れていることを発見しました。これに切り替えることを真剣に考えています。誰かこれについて個人的な経験がありますか?
Thinkbotのldap-activerecord-gatewayをチェックしましたか?検討する必要があるかもしれません...
http://github.com/thoughtbot/ldap-activerecord-gateway/tree/master