3

私は現在、ユーザー認証を担当する Rails プロジェクトに取り組んでいます。サードパーティ認証を使用することに決めたので、セットアップ例に従ってみました。この例は Kevin Thompson によって作成され、 exampleと呼ばれます。

LDAP サーバーのドキュメントによると、実行する必要がある手順は次のとおりです。

  1. LDAP サーバーに接続します。
  2. 匿名でバインドします (DN とパスワードなし)。
  3. ユーザー名を使用して LDAP エントリを検索します
  4. 見つかった場合は、ユーザー名の DN を取得します。
  5. 指定したユーザーの DN とパスワードで再バインドします。
  6. この再バインドが成功すると、ユーザーは認証されます。

私はトンプソンの例に従いましたが、私は気の利いたものを使用していません。ユーザー管理にはdeviseを、認証にはomniauth-ldapを使用します。しかし、それは完全には機能していません。サーバーのドキュメントで指示されていることと、omniauth-ldap が実際に行っていることとの不一致と関係があるのではないかと考えています...

具体的には、私の問題は、常に「資格情報が無効です」というエラーが発生することです。これは、私がしなければならないことと omniauth-ldap が行っていることが一致していないためですか?

アドバイスや提案は大歓迎です!

私がどのようにセットアップしたかについてのもう少しの情報 (匿名性を維持するために、いくつかのものを置き換えました) リクエストに応じて、私のコードをさらに投稿できます。

config/initializers/devise.rb:

  config.omniauth :ldap,
    :host => 'ldap1.its.domain.ext',
    :base => 'ou=People, dc=domain, dc=ext',
    :port => 389,
    :attrs => 'uid',
    :method => :plain,
    :uid => 'uid'

アプリ/コントローラー/ユーザー/omniauth_callbacks_controller.rb:

class Users::OmniauthCallbacksController <     Devise::OmniauthCallbacksController
  skip_before_filter :verify_authenticity_token
  def ldap
    ldap_return = request.env["omniauth.auth"]["extra"]["raw_info"]
    username = ldap_return.uid[0].to_s

    if @user = User.find_by_username(username)
      sign_in_and_redirect @user
    else
      @user = User.create(:username => username,)
      sign_in_and_redirect @user
    end
  end
end
4

2 に答える 2

0

まだ評判が 50 に達していないため、これをコメントとして追加することはできませんが、ここにいる一部の人々に役立つ可能性があることがわかりました。

http://blackfistsecurity.blogspot.com.au/2011/12/rails-authentication-using-devise-and.html

私はもともと Omniauth と Omniauth-LDAP を他に何も使わずに使おうとしていましたが、omniauth-ldap に関するドキュメントが不足しているため、物事が難しくなっています。

編集:

Omniauth-LDAP を使用する代わりに、バニラのデバイス インストールを選択することになり、独自の LDAP 機能を作成しました。注意:私は mongoid を使用しているため、以下のコードは MongoDB を対象としています。ただし、ActiveRecord 用に簡単に変更できます。

これを行うために、次のようにコントローラーでnewアクションを編集しました。sessions

ldap = Net::LDAP.new
ldap.host = 'domainOrIP'
ldap.port = 389

ldap.auth 'user', 'password'

if ldap.bind
    # success, so let's check if the user exists
     @existing_user = User.where({username: params[:user][:username] }).first

     if @existing_user == nil
       #create the user
         @user = User.new( {username: params[:user][:username], password: ''})
         # I didn't personally store the user's password, as I use LDAP for authentication. (If you save this, please hash and salt it first!!)
         @user.save
         flash[:notice] = "Success!"
         redirect_to '/'
     else # already existed
       @user = User.find({ username: params[:user][:username] })
         flash[:notice]  = "Success!"
         redirect_to '/'
     end
else
    flash[:danger] = "An error occurred whilst authenticating with your LDAP server. Please check the configuration and try again."
    redirect_to '/'
end

その後、私はDeviseを離れて他のすべてを処理しました。私にとっては見事に機能しました。ただし、上記のコードはメモリからのものであるため、100% 正確ではない可能性があります。:)

編集 2: Net::LDAP クラスの使用方法の詳細については、 http ://www.rubydoc.info/gems/ruby-net-ldap/Net/LDAP を参照してください。

于 2015-01-21T01:00:57.487 に答える