0

次の手順に従って、Rails アプリでDeviseを介して基本的な LDAP 認証をセットアップしました。

AD アカウントで初めてログインすると、データベースに対応するユーザーが作成され、get_ldap_param() によって検出された AD アカウントのオブジェクト プロパティから姓、名、表示名、電子メールが入力されます。

プロセスは、AD ユーザーが空白の姓 (AD 属性 'sn') などの空白の属性を持っている場合を除き、正常に動作しています。これにより、次のエラーが発生します。

NoMethodError in Devise::SessionsController#create
undefined method `sn' for #<Net::LDAP::Entry:0x00000004920758>

ユーザーモデルは以下です。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :ldap_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :firstname, :lastname, :displayname

  before_save :get_ldap_lastname, :get_ldap_firstname, :get_ldap_displayname, :get_ldap_email

  def get_ldap_lastname
      Rails::logger.info("### Getting the users last name")
      tempname = Devise::LdapAdapter.get_ldap_param(self.username,"sn")
      puts "\tLDAP returned lastname of " + tempname
      self.lastname = tempname
  end

  def get_ldap_firstname
      Rails::logger.info("### Getting the users first name")
      tempname = Devise::LdapAdapter.get_ldap_param(self.username,"givenname")
      puts "\tLDAP returned firstname of " + tempname
      self.firstname = tempname
  end

  def get_ldap_displayname
      Rails::logger.info("### Getting the users display name")
      tempname = Devise::LdapAdapter.get_ldap_param(self.username,"displayname")
      self.displayname = tempname
  end

  def get_ldap_email
      Rails::logger.info("### Getting the users email address")
      tempmail = Devise::LdapAdapter.get_ldap_param(self.username,"mail")
      self.email = tempmail
  end
end

エラーはこの呼び出しから来ています:

Devise::LdapAdapter.get_ldap_param(self.username,"sn")

get_ldap_param が空白の属性に遭遇した場合、未定義ではなく空白を返すようにしたいと考えています。

以下のコードで対応を試みたのですが、get_ldap_param を呼び出した瞬間にエラーが発生するためうまくいきません。

if tempname.none?
  tempname = ""
end

これを行うには、Devise gem を変更する必要がありますか? または、呼び出し後に何らかの方法で行うことができますか?

私の初心者を許してください

ありがとう

4

1 に答える 1

1

これは、devise_ldap_authenticatable デバイスモジュールのバグのようです。ハッシュ演算子の代わりに、LDAP エントリの属性値にメソッド アクセサーを使用しています。

  def ldap_param_value(param)
    filter = Net::LDAP::Filter.eq(@attribute.to_s, @login.to_s)
    ldap_entry = nil
    @ldap.search(:filter => filter) {|entry| ldap_entry = entry}

    if ldap_entry
      if ldap_entry[param]
        DeviseLdapAuthenticatable::Logger.send("Requested param #{param} has value #{ldap_entry.send(param)}")
        value = ldap_entry.send(param)
        value = value.first if value.is_a?(Array) and value.count == 1
        value

ruby-net-ldap のドキュメントによると、ハッシュ アクセサーを使用して、次のような値を取得する必要があります。

  def ldap_param_value(param)
    filter = Net::LDAP::Filter.eq(@attribute.to_s, @login.to_s)
    ldap_entry = nil
    @ldap.search(:filter => filter) {|entry| ldap_entry = entry}

    if ldap_entry
      if value = ldap_entry[param]
        DeviseLdapAuthenticatable::Logger.send("Requested param #{param} has value #{value}")
        value = value.first if value.is_a?(Array) and value.count == 1
        value

これはバグであり、devise_ldap_authenticatable で提出した問題をこの情報で更新できます。

于 2012-05-16T18:27:44.253 に答える