2012-04-30 22 views
0

我按照这些说明设置通过制定基本LDAP身份验证在我的Rails应用程序: http://blackfistsecurity.blogspot.dk/2011/12/rails-authentication-using-devise-and.htmlNoMethodError与设计LDAP和空白的用户对象属性

首次登录与AD帐户创建了相应的用户数据库,填充姓氏,名字,显示名和电子邮件来自AD发现的对象属性get_ldap_param()

该过程工作正常除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 

我是否需要修改设计的宝石要做到这一点,还是可以调用后莫名其妙地做了什么?

请原谅我的newbness

感谢

回答

1

这看起来像devise_ldap_authenticatable色器件模块中的错误。它使用method accessor for the LDAP entry attribute values instead of the hash operatior

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 

按照文档红宝石净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更新the issue you filed这个信息。

+0

我修改了你的修改ldap_adapter.rb - 我现在可以通过登录过程,而不是空白的信息,但它插入'--- []',可能插入空白栏数组。就像你说的那样,def似乎是devise_ldap中的一个bug。我将添加你对我发布在他们的git页面上的问题的回答。谢谢 – samJL