次の手順に従って、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 を変更する必要がありますか? または、呼び出し後に何らかの方法で行うことができますか?
私の初心者を許してください
ありがとう