45

Rails アプリケーションを ActiveDirectory に接続しようとしています。AD とデータベース (現在は MySQL) の間でユーザーに関するデータを同期します (ただし、SQL Server または PostgreSQL に変わる可能性があります)。

私はactivedirectory-rubyをチェックアウトしましたが、それは本当にバグがあるようです(1.0リリースの場合!?)。Net::LDAP をラップしているので、代わりにそれを使用してみましたが、実際の LDAP の構文に非常に近く、ActiveRecord のような構文のため、ActiveDirectory-Ruby の抽象化を楽しんでいました。

ディレクトリ サーバー用の洗練された ORM タイプのツールはありますか? LDAP 用の何らかの足場ツール (ユーザー、グループ、組織単位などの CRUD) があればなおさらです。その後、Authlogic を介して既存の認証コードとすばやく統合し、すべてのデータの同期を維持することができました。

4

6 に答える 6

41

以下は、職場で ActiveDirectory サーバーからのユーザー ログインを確認するためにnet-ldap gemで使用するサンプル コードです。

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']です。

  • a のすべての属性は、Net::LDAP::Entry値が 1 つしかない場合でも、常に値の配列です。複数の「displayName」値を持つユーザーを持つのはばかげているかもしれませんが、LDAP の一般的な性質はそれが可能であることを意味します。最後のfirst呼び出しでは、1 つの文字列の配列がユーザーのフル ネームの文字列に変わります。

于 2011-04-16T03:46:21.777 に答える
4

これは本当の答えよりも逸話的です...

私は、Samba と OpenLDAP サーバーを使用して同様の経験をしました。自分のやりたいことを実際に行うためのライブラリが見つからなかったので、独自のヘルパー クラスを作成しました。

ldapbrowserを使用して、ユーザーを「公式」の方法で作成したときに Samba が入力したフィールドを確認し、基本的にそれを複製しました。

唯一のトリッキー/非標準の LDAP の問題は、私たちが持っているクレイジーなパスワード暗号化でした。

ユーザーパス:

"{MD5}" + Base64.encode64(Digest::MD5.digest(pass))

sambaNTP パスワード:

OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase

関数についてはdef authenticate(user, pass)、資格情報を使用して LDAP をドメインにバインドしようとします。例外をキャッチするとログインに失敗し、それ以外の場合は許可します。

于 2008-12-22T20:43:20.950 に答える
4

申し訳ありませんが、まだコメントできません...おそらく誰かがこれを適切に再配置できます。

@Phrogz のソリューションはうまく機能しますが、次のように auth[:username] が設定されていないため、bind_simple (バインド内) で 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 }
于 2012-01-20T19:09:21.893 に答える
2

私は ruby​​-activedirectory を使い始め、それを拡張/修正して、Github で judy-activedirectory をホストしました。

次の反復を行って、ActiveLdap のコード ベースがはるかに優れていることを発見し、それに切り替えることを真剣に考えています。誰かがこれについて個人的な経験を持っていますか?

于 2009-02-04T21:16:03.030 に答える
1

Thoughtbotのldap-activerecord-gatewayをチェックアウトしましたか?それはあなたが考慮すべき何かかもしれません...

http://github.com/thoughtbot/ldap-activerecord-gateway/tree/master

于 2008-12-02T21:20:47.143 に答える