ruby - 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?() 提前检查,但看起来在访问空字段的那一刻出现异常。如果字段为空,我想在输出中放置一个自定义字符串(“数据不存在”)。可能它只是一个小开关,我找不到它......
非常感谢!
解决方案
两天前我遇到了同样的问题!我可以推荐两件事:
- 通过哈希键访问
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')}"
推荐阅读
- java - 使用 Builder 来构建封装对象
- java - 在工作表中添加大量 ValidationData 时,POI 写入损坏的 .xlsx
- javascript - 使用jquery提交表单
- python - 我正在尝试制作我的骰子游戏,而不是每次滚动都改变骰子的一个数字,而是改变所有骰子
- java - 如何使用 Spring Data Jpa 将域实体对象写入多个数据库表?
- php - 如何进行sql备份?
- python - Scipy最小化不考虑约束
- python - 如何在谷歌日历 api 中检查事件是否已完成
- java - 如何以编程方式单击其他活动按钮
- automated-tests - 在 beforeEach 中使用异步时,测试中的所有操作都会触发两次