首页 > 解决方案 > ruby 通过空字段的 ldap 搜索引发异常

问题描述

我尝试从 LDAP(内部 AD)获取一些信息。一切都按原样工作,除非我想从空字段中获取数据。

require 'net/ldap'
...

def getDatafromAD(ad_hostname,ad_dn,ad_password,username)
  ldap = Net::LDAP.new :host => ad_hostname, :port => 389, :auth => {
          :method => :simple,
          :username => ad_dn,
          :password => ad_password }

  filter = Net::LDAP::Filter.eq("cn", username)
  treebase = "ou=myOU,dc=example,dc=com"
  attrs = ["givenName", "mobile", "mail", "cn", "sn", "person"]

  ldap.search( :base => treebase, :filter => filter, :attributes => attrs ) do |entry|
         puts "UID: #{entry.dn}"
         puts "#{entry.cn.first}: Surename: #{entry.sn.first} Givenname: #{entry.givenName.first} Mail: #{entry.mail.first} Mobile: #{entry.mobile.first}"
  end

end

这运行良好,直到一个字段为空(在本例中为移动):

Traceback (most recent call last):
    16: from query_userdata.rb:79:in `<main>'
    15: from query_userdata.rb:79:in `each'
    14: from query_userdata.rb:81:in `block in <main>'
    13: from query_userdata.rb:58:in `getDatafromAD'
    12: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap.rb:782:in `search'
    11: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/instrumentation.rb:19:in `instrument'
    10: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap.rb:783:in `block in search'
     9: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap.rb:1311:in `use_connection'
     8: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap.rb:784:in `block (2 levels) in search'
     7: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/connection.rb:388:in `search'
     6: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/instrumentation.rb:19:in `instrument'
     5: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/connection.rb:399:in `block in search'
     4: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/connection.rb:399:in `loop'
     3: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/connection.rb:445:in `block (2 levels) in search'
     2: from /usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap.rb:786:in `block (3 levels) in search'
     1: from query_userdata.rb:62:in `block in getDatafromAD'
/usr/share/gems/gems/net-ldap-0.17.0/lib/net/ldap/entry.rb:185:in `method_missing': undefined method `mobile' for #<Net::LDAP::Entry:0x000055c0d912ac60> (NoMethodError)

有人可以给我一个提示如何解决这个问题。我的知识/XP 无法处理这个问题。我尝试使用 .empty?() 提前检查,但看起来在访问空字段的那一刻出现异常。如果字段为空,我想在输出中放置一个自定义字符串(“数据不存在”)。可能它只是一个小开关,我找不到它......

非常感谢!

标签: rubyldap

解决方案


两天前我遇到了同样的问题!我可以推荐两件事:

  • 通过哈希键访问entry属性。调用缺失的方法会引发错误,但尝试访问缺失键的值将返回一个空数组
entry[:missing_key]
# => []

entry[:missing_key][0]
# => nil

entry.missing_key.first
# => *** NoMethodError Exception: undefined method `missing_key' for #<Net::LDAP::Entry:0x00005605a06bbf88>
  • 将潜在值与字符串连接时使用||运算符。nil
puts "SN:     #{(entry[:sn][0]     || 'data not there')}" +
     "Mobile: #{(entry[:mobile][0] || 'data not there')}" +
     "Foo:    #{(entry[:foo][0]    || 'data not there')}"

推荐阅读