web-dev-qa-db-ja.com

RubyまたはRails

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

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

ディレクトリサーバー用のエレガントなORMタイプのツールはありますか?さらに良いのは、LDAP用のある種の足場ツール(ユーザー、グループ、組織単位などのCRUD)がある場合です。次に、Authlogicを介して既存の認証コードとすばやく統合し、すべてのデータの同期を保つことができます。

44
Clinton Judy

これが 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.displayNamesome_entry['displayName']と同じです。

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

40
Phrogz
8
mrTomahawk

これは実際の答えよりも逸話です...

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をドメインにバインドしようとします。例外をキャッチした場合はログインに失敗し、それ以外の場合は許可します。

4
Lolindrath

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

@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 }
3
jordanpg

Ruby-activedirectoryを使い始め、それを拡張/いくつかの修正を加えて、Githubでjudy-activedirectoryをホストしました。

次の繰り返しで、ActiveLdapのコードベースがはるかに優れていることを発見しました。これに切り替えることを真剣に考えています。誰かこれについて個人的な経験がありますか?

2
Clinton Judy

Thinkbotのldap-activerecord-gatewayをチェックしましたか?検討する必要があるかもしれません...

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

1
Tim